{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e8b9a2e8-1867-45c6-8e58-45648d99faf5",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# 基于python实现的线性代数"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b68e2815-cb40-428b-a1a1-70bd7580cd9c",
   "metadata": {},
   "source": [
    "# 基本概念\n",
    " \n",
    "## 向量 Vector\n",
    "Vectors, and vector spaces, are fundamental to *linear algebra*, and they're used in many machine learning models. Vectors describe spatial lines and planes, enabling you to perform calculations that explore relationships in multi-dimensional space.\n",
    "\n",
    "实际上，我们在高中就学过向量的概念，例如重力，浮力都可以表现为有大小有方向的向量。\n",
    "\n",
    "**在数学中我们把既有大小又有方向的量称为向量（vector)，而把只有大小没有方向的量成为数量。对应在物理中，向量称为矢量，数量称为标量。**\n",
    "\n",
    "---\n",
    "At its simplest, a vector is a numeric element that has both *magnitude* and *direction*. The magnitude represents a distance (for example, \"2 miles\") and the direction indicates which way the vector is headed (for example, \"East\"). **Vectors are defined by an n-dimensional coordinate that describe a point in space that can be connected by a line from an arbitrary origin.**\n",
    "\n",
    "That all seems a bit complicated, so let's start with a simple, two-dimensional example. In this case, we'll have a vector that is defined by a point in a two-dimensional plane: A two dimensional coordinate consists of an *x* and a *y* value, and in this case we'll use **2** for *x* and **1** for *y*.\n",
    "\n",
    "Our vector can be written as **v**=(2,1), but more formally we would use the following notation, in which the dimensional coordinate values for the vector are shown as a matrix:\n",
    "\\begin{equation}\\vec{v} = \\begin{bmatrix}2 \\\\ 1 \\end{bmatrix}\\end{equation}\n",
    "\n",
    "So what exactly does that mean? Well, the coordinate is two-dimensional, and describes the movements required to get to the end point (of *head*) of the vector - in this case, we need to move 2 units in the *x* dimension, and 1 unit in the *y* dimension. Note that we don't specify a starting point for the vector - we're simply describing a destination coordinate that encapsulate the magnitide and direction of the vector. Think about it as the directions you need to follow to get to *there* from *here*, without specifying where *here* actually is!\n",
    "\n",
    "It can help to visualize the vector, and with a two-dimensional vector, that's pretty straightforward. We just define a two-dimensional plane, choose a starting point, and plot the coordinate described by the vector relative to the starting point.\n",
    "\n",
    "Run the code in the following cell to visualize the vector **v** (which remember is described by the coordinate (2,1))."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "d60fd504-4ddf-4f9c-9600-1b3f138c48bb",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-18T06:33:33.737859Z",
     "iopub.status.busy": "2022-03-18T06:33:33.737041Z",
     "iopub.status.idle": "2022-03-18T06:33:34.023199Z",
     "shell.execute_reply": "2022-03-18T06:33:34.022368Z",
     "shell.execute_reply.started": "2022-03-18T06:33:33.737822Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "## 线性代数-向量\n",
    " \n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 我们使用numpy中的数组来表示向量\n",
    "v = np.array([2,1])\n",
    "\n",
    "# 绘制图像，展现向量的空间表达.\n",
    " \n",
    "fig,axes=plt.subplots()\n",
    "axes.set_xlim(0,3)\n",
    "axes.set_ylim(0,3)\n",
    "axes.grid()\n",
    "axes.arrow(0,0,v[0],v[1],head_length=0.1,head_width=0.1,color='blue')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f1f626ce-5abe-4a22-bc31-020dc3580902",
   "metadata": {},
   "source": [
    "## Calculating Vector Magnitude and Direction\n",
    "We tend to work with vectors by expressing their components as *cartesian coordinates*; that is, *x* and *y* (and other dimension) values that define the number of units travelled along each dimension. So the coordinates of our (2,1) vector indicate that we must travel 2 units along the *x* axis, and *1* unit along the *y* axis.\n",
    "\n",
    "However, you can also work with verctors in terms of their *polar coordinates*; that is coordinates that describe the magnitude and direction of the vector. The magnitude is the overall distance of the vector from tail to head, and the direction is the angle at which the vector is oriented.\n",
    "\n",
    "### Calculating Magnitude\n",
    "Calculating the magnitude of the vector from its cartesian coordinates requires measuring the distance between the arbitrary starting point and the vector head point. For a two-dimensional vector, we're actually just calculating the length of the hypotenuse in a right-angled triangle - so we could simply invoke Pythagorean theorum and calculate the square root of the sum of the squares of it's components, like this:\n",
    "\n",
    "\\begin{equation}\\|\\vec{v}\\| = \\sqrt{v_{1}\\;^{2} + v_{2}\\;^{2}}\\end{equation}\n",
    "$$\n",
    "\n",
    "The notation for a vector's magnitude is to surround the vector name with vertical bars - you can use single bars (for example, |**v**|) or double bars (||**v**||). Double-bars are often used to avoid confusion with absolute values. Note that the components of the vector are indicated by subscript indices (v<sub>1</sub>, v<sub>2</sub>,...v<sub>*n*</sub>),\n",
    "\n",
    "In this case, the vector **v** has two components with values **2** and **1**, so our magnitude calculation is:\n",
    "\n",
    "\\begin{equation}\\|\\vec{v}\\| = \\sqrt{2^{2} + 1^{2}}\\end{equation}\n",
    "\n",
    "Which is:\n",
    "\n",
    "\\begin{equation}\\|\\vec{v}\\| = \\sqrt{4 + 1}\\end{equation}\n",
    "\n",
    "So:\n",
    "\n",
    "\\begin{equation}\\|\\vec{v}\\| = \\sqrt{5} \\approx 2.24\\end{equation}\n",
    "\n",
    "You can run the following Python code to get a more precise result (note that the elements of a numpy array are zero-based)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3a2d61aa-f039-4cd7-b9f1-583bba3dd0d2",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "## 线性代数-向量\n",
    "# 向量大小计算\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 我们使用numpy中的数组来表示向量\n",
    "v = np.array([2,1])\n",
    "\n",
    "magnitude=np.sqrt(np.square(v[0])+np.square(v[1]))\n",
    "print(\"向量大小为：\",magnitude)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "de3b90ab-b038-4e70-a37e-517f32586f3b",
   "metadata": {},
   "source": [
    "This calculation works for vectors of any dimensionality - you just take the square root of the sum of the squared components:\n",
    "\n",
    "\\begin{equation}\\|\\vec{v}\\| = \\sqrt{v_{1}\\;^{2} + v_{2}\\;^{2} ... + v_{n}\\;^{2}}\\end{equation}\n",
    "\n",
    "In Python, *numpy* provides a linear algebra library named **linalg** that makes it easier to work with vectors - you can use the **norm** function in the following code to calculate the magnitude of a vector:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "68648dd4-a9e4-4726-80b1-ef0bd22832b8",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# 可以使用numpy内置方法求得范数\n",
    "import numpy as np\n",
    "\n",
    "vMag = np.linalg.norm(v)\n",
    "print (vMag)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bd459a98-2e98-4f2f-8ee4-3fc7174f154f",
   "metadata": {},
   "source": [
    "### Calculating Direction 计算方向\n",
    "To calculate the direction, or *amplitude*, of a vector from its cartesian coordinates, you must employ a little trigonometry. We can get the angle of the vector by calculating the *inverse tangent*; sometimes known as the *arctan* (the *tangent*  calculates an angle as a ratio - the inverse tangent, or **tan<sup>-1</sup>**, expresses this in degrees).\n",
    "\n",
    "In any right-angled triangle, the tangent is calculated as the *opposite* over the *adjacent*. In a two dimensional vector, this is the *y* value over the *x* value, so for our **v** vector (2,1):\n",
    "\n",
    "\\begin{equation}tan(\\theta) = \\frac{1}{2}\\end{equation}\n",
    "\n",
    "This produces the result ***0.5***, from which we can use a calculator to calculate the inverse tangent to get the angle in degrees:\n",
    "\n",
    "\\begin{equation}\\theta = tan^{-1} (0.5) \\approx 26.57^{o}\\end{equation}\n",
    "\n",
    "Note that the direction angle is indicated as ***&theta;***.\n",
    "\n",
    "Run the following Python code to confirm this:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "32c05773-8abd-4bf7-ae0c-3e4000d8c78b",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-18T06:44:49.263218Z",
     "iopub.status.busy": "2022-03-18T06:44:49.262668Z",
     "iopub.status.idle": "2022-03-18T06:44:49.268833Z",
     "shell.execute_reply": "2022-03-18T06:44:49.268212Z",
     "shell.execute_reply.started": "2022-03-18T06:44:49.263171Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "向量对应tan值为： 0.5\n",
      "对应弧度为： 0.4636476090008061\n",
      "对应角度为： 26.56505117707799\n"
     ]
    }
   ],
   "source": [
    "import numpy as np \n",
    "tan=v[1]/v[0]\n",
    "print(\"向量对应tan值为：\",tan)\n",
    "arc=np.arctan(tan)\n",
    "print(\"对应弧度为：\",arc)\n",
    "print(\"对应角度为：\",np.degrees(arc))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0f4a7a35-2f84-494a-b8b4-aa8013eeae41",
   "metadata": {},
   "source": [
    "here is an added complication however, because if the value for *x* or *y* (or both) is negative, the orientation of the vector is not standard, and a calculator can give you the wrong tan<sup>-1</sup> value. To ensure you get the correct direction for your vector, use the following rules:\n",
    "- Both *x* and *y* are positive: Use the tan<sup>-1</sup> value.\n",
    "- *x* is negative, *y* is positive: Add 180 to the tan<sup>-1</sup> value.\n",
    "- Both *x* and *y* are negative: Add 180 to the tan<sup>-1</sup> value.\n",
    "- *x* is positive, *y* is negative: Add 360 to the tan<sup>-1</sup> value.\n",
    "\n",
    "To understand why we need to do this, think of it this way. A vector can be pointing in any direction through a 360 degree arc.  Let's break that circle into four quadrants with the x and y axis through the center. Angles can be measured from the x axis in both the positive (counter-clockwise) and negative (clockwise) directions. We'll number the quadrants in the positive (counter-clockwise) direction (which is how we measure the *positive* angle) like this:\n",
    "\n",
    "    \n",
    "\n",
    "    2 | 1\n",
    "    - o -\n",
    "    3 | 4\n",
    "\n",
    "\n",
    "OK, let's look at 4 example vectors\n",
    "\n",
    " 1. Vector [2,4] has positive values for both x and y. The line for this vector travels through the point 0,0 from quadrant 3 to quadrant 1. Tan<sup>-1</sup> of 4/2 is around 63.4 degrees, which is the positive angle from the x axis to the vector line - so this is the direction of the vector.\n",
    " 2. Vector [-2,4] has a negative x and positive y. The line for this vector travels through point 0,0 from quadrant 4 to quadrant 2. Tan<sup>-1</sup> of 4/-2 is around -64.4 degrees, which is the *negative* angle from x to the vector line; but in the wrong direction (as if the vector was travelling from quadrant 2 towards quadrant 4). So we need the opposite direction, which we get by adding 180.\n",
    " 3. Vector [-2,-4] has negative x and y. The line for the vector travels through 0,0 from quadrant 1 to quadrant 3. Tan<sup>-1</sup> of -4/-2 is around 63.4 degrees, which is the angle between the x axis and the line, but again in the opposite direction, from quadrant 3 to quadrant 1; we need to go a further 180 degrees to reflect the correct direction.\n",
    " 4. Vector [2,-4] has positive x and negative y. It travels through 0,0 from quadrant 2 to quadrant 4. Tan<sup>-1</sup> of -4/2 is around -64.4 degrees, which is the *negative* angle from the x axis to the vector line. Technically it's correct, the line is travelleing down and to the right at an angle of -63.4 degrees; but we want to express the *positive* (counter-clockwise) angle, so we add 360.\n",
    "\n",
    "\n",
    "In the previous Python code, we used the *math.**atan*** function to calculate the inverse tangent from a numeric tangent. The *numpy* library includes a similar ***arctan*** function. When working with numpy arrays, you can also use the *numpy.**arctan2*** function to return the inverse tangent of an array-based vector in *radians*, and you can use the *numpy.**degrees*** function to convert this to degrees. The ***arctan2*** function automatically makes the necessary adjustment for negative *x* and *y* values."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "605403da-2060-493c-b6b9-c8fce06174c6",
   "metadata": {},
   "source": [
    "## Vector Addition 向量的加法\n",
    "So far, we've worked with one vector at a time. What happens when you need to add two vectors.\n",
    "\n",
    "Let's take a look at an example, we already have a vector named **v**, as defined here:\n",
    "\\begin{equation}\\vec{v} = \\begin{bmatrix}2 \\\\ 1 \\end{bmatrix}\\end{equation}\n",
    "Now let's create a second vector, and called **s** like this:\n",
    "\\begin{equation}\\vec{s} = \\begin{bmatrix}-3 \\\\ 2 \\end{bmatrix}\\end{equation}\n",
    "\n",
    "Run the cell below to create **s** and plot it together with **v**:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "9fd08270-5506-4791-b8dc-16ddde985022",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-18T06:49:45.073581Z",
     "iopub.status.busy": "2022-03-18T06:49:45.073150Z",
     "iopub.status.idle": "2022-03-18T06:49:45.405843Z",
     "shell.execute_reply": "2022-03-18T06:49:45.405206Z",
     "shell.execute_reply.started": "2022-03-18T06:49:45.073548Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAsUAAAKvCAYAAACCpLIkAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzt3Xm8XlV97/HvysAYRgkCRkAQo4iIgopTTaxaFCoVq9cBbdUarVi1zjiLQ71SRa/4UnCoA9Saq+KAIuCQoi0qpmWUQRQHEAVEkCBz1v1jhQtaICFn5+xzznq/X6+8PJs8eZ6fKyc5n+yzn7VLrTUAANCzWWMPAAAAYxPFAAB0TxQDANA9UQwAQPdEMQAA3RPFAAB0b7AoLqXMLqX8dynl2KGeEwAAJsOQZ4pfmuTsAZ8PAAAmxSBRXEpZkGTfJB8d4vkAAGAyzRnoed6X5NVJNrm9B5RSliRZkiQbbLDBnttvv/1AL83KlSsza5bLw4dgLYdlPYdlPYdjLYdlPYdlPYd13nnnXVZrnb+6x004iksp+yW5pNa6vJSy6PYeV2s9MsmRSbJw4cJ67rnnTvSlWWXZsmVZtGjR2GPMCNZyWNZzWNZzONZyWNZzWNZzWKWUn6/J44b4Z8jDkzyxlPKzJP+W5NGllKMGeF4AAJgUE47iWuvBtdYFtdYdkzwtybdqrQdOeDIAAJgkLlgBAKB7Q73RLklSa12WZNmQzwkAAOuaM8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRvwlFcStmglPKDUspppZSzSilvHWIwAACYLHMGeI7rkjy61rqilDI3yXdLKcfVWr83wHMDAMA6N+EorrXWJCtWHc5d9aNO9HkBAGCylNa0E3ySUmYnWZ7knkk+WGt9zW08ZkmSJUkyf/78PZcuXTrh16VZsWJF5s2bN/YYM4K1HJb1HJb1HI61HJb1HJb1HNbixYuX11r3Wt3jBoni//9kpWye5Jgk/1BrPfP2Hrdw4cJ67rnnDva6vVu2bFkWLVo09hgzgrUclvUclvUcjrUclvUclvUcVilljaJ40N0naq1XJPl2kn2GfF4AAFiXhth9Yv6qM8QppWyY5LFJzpno8wIAwGQZYveJbZN8ctV1xbOSLK21HjvA8wIAwKQYYveJ05M8YIBZAABgFO5oBwBA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdmzP2AKyBU09NTjst2WGH9mPBgmTu3LGnAgCYMUTxdHD44cknPpHMm5fceGNyzTXJ5psn222X7LRT8tSnJh/5SHLggcmGG449LQDAtDPhyydKKXcvpXy7lPKjUspZpZSXDjEYt/K2tyXrr59ceWVy9dXJypXJ5ZcnZ56ZfPnLya9/nSxZkixfPvakAADT0hDXFN+Y5BW11l2T7J3koFLKrgM8LzfbdtvkjW9MNt74tn++lGTffZOH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n5PPfa6dNV6+fOypAIB1RBTDHXnFK9od8ZJkr72Shz2sbecGAMwoohhWZ7PN2lnjT34yOfnkZM6ctp0bADBjiGJYU89+dnLNNclWWyWPeUyy447t1tEAwLQniuHO2GCD5NJLk2OPTX7+82T99ds1xwDAtCaKYW3su29yww3J/e7XdqdYf/1kxYqxpwIA1pIohrU1Z05y+unJd7/bLqPYZJPkwx8eeyoAYC2IYpiohz+87Uixzz7J3/99u0Peb3879lQAwJ0gimEIs2Ylxx2XnHFGO95qq+Stbx13JgBgjYliGNJuuyUrVybPeU7ylre0s8a//OXYUwEAqyGKYWilJB//eHLBBe14++2TF77QraIBYAoTxbCu7LhjC+GDD06OOKJdYnH22WNPBQDcBlEM69o735n85jft4113Tf7qr5w1BoApRhTDZNh66xbC739/8qUvtbPG3//+2FMBAKuIYphML3lJ8vvft4/33jt50IPadm4AwKhEMUy2TTZpZ42PPjr54Q/bTUCOP37sqQCga6IYxvKMZyTXXptst1278cfd7pZcd93YUwFAl0QxjGn99ZOLLmo3/vjVr5INNkg+85mxpwKA7ohimAr22Se54YZkzz3bGeRSkquuGnsqAOiGKIapYs6cdo3xySe34003TT7wgXFnArgD11yTrFjRbuS5YsVt/7j22rGnhDUjimGq2Xvv9hXmL/+y7VZRSnLppWNPBfBHfv/7ZMstky22SE49tX38pz823zzZaSdbszM9DBLFpZSPl1IuKaWcOcTzQfdKSb785eSss9rx1lsnr3/9uDMB3MommyT3vW9y440tem+44X/+WH/95KCD2l9pMNUNdab4E0n2Gei5gJvtums7a7xkSbszXinJz38+9lQAKSU57LBko41u++fXWy95+MOT171ucueCtTVIFNdaT0py+RDPBfyJUpIjjrglhnfcMXne83w/EhjdIx/ZLpG4LXe5S7J0qbPETB+lDvSFtZSyY5Jja6273c7PL0myJEnmz5+/59KlSwd5XZIVK1Zk3rx5Y48xI0yLtfzVr5KLL24f3/e+bRu3KWparOc0Yj2HYy0n7vLLkwsuaB8vWLAiF154y3rOmpXc+97JhhuONNw05/NzWIsXL15ea91rdY+bMxnDJEmt9cgkRybJwoUL66JFiybrpWe8ZcuWxXoOY9qs5WWX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xfDDHz4pLw8wLYhigMm0cGE7a3zQQcmhh7Za/elP18lLffWr7ekf/eh2fOaZLYYf+MB18nIA05ooBphspSSHH55ceGE73nnn5MADW7EO4P/+3/YS++3X/vf889tT3/e+gzw9wIwkigHGcre7tVp9+9uTo49ut4k77bS1frpPfKJF8FOfmmy6afKLX7ST0jvvPNzIADOVKAYY2+tfn/z2t+3jPfZo1zusXLlGv7TW5AMfaDH8nOe0zv71r9vub3e/+zqcGWCGGSSKSyn7lFLOLaWcX0p57RDPCdCVLbdshXvkke2dcbNnJyeddLsPrzUqFYoaAAAPuklEQVR517vayeWXvCS5971bV194YXLXu07i3AAzxISjuJQyO8kHkzw+ya5Jnl5K2XWizwvQpec/P1mxItloo+RRj2q1e8MN//+na01e97oWwwcfnDzoQe2s8Nlnt64GYO3MGeA5Hpzk/FrrT5OklPJvSfZP8qMBnhugPxtvnFx9dfKFL7S9jddbLyu/8MX8csVmmbXqVMajH5185SutnQGYuCEun7hbkl/e6vjCVf8NgIk44IDk+uuTXXbJrAP+Kr+75Ibsv39y7bXJN78piAGGVOoEtwAqpfx1kn1qrX+36vhZSR5Sa33xnzxuSZIlSTJ//vw9ly5dOqHX5RYrVqzIvHnzxh5jRrCWw7Kew6k31Vx9zdXWcyA+N4dlPYdlPYe1ePHi5bXWvVb3uCEun7goya3f47xg1X/7I7XWI5McmSQLFy6sixYtGuClSZJly5bFeg7DWg7Leg7Leg7HWg7Leg7Leo5jiMsnTkmySynlHqWU9ZI8LcmXB3heAACYFBM+U1xrvbGU8uIkxyeZneTjtdazJjwZAABMkiEun0it9WtJvjbEcwEAwGRzRzsAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALo3oSgupTyllHJWKWVlKWWvoYYCAIDJNNEzxWcmOSDJSQPMAgAAo5gzkV9caz07SUopw0wDAAAjKLXWiT9JKcuSvLLW+sM7eMySJEuSZP78+XsuXbp0wq9Ls2LFisybN2/sMWYEazks6zks6zkcazks6zks6zmsxYsXL6+1rvYy39WeKS6lfCPJNrfxU6+vtX5pTQeqtR6Z5MgkWbhwYV20aNGa/lJWY9myZbGew7CWw7Kew7Kew7GWw7Kew7Ke41htFNdaHzMZgwAAwFhsyQYAQPcmuiXbk0opFyZ5aJKvllKOH2YsAACYPBPdfeKYJMcMNAsAAIzC5RMAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdm1AUl1IOLaWcU0o5vZRyTCll86EGAwCAyTLRM8UnJtmt1rp7kvOSHDzxkQAAYHJNKIprrSfUWm9cdfi9JAsmPhIAAEyuIa8pfm6S4wZ8PgAAmBSl1nrHDyjlG0m2uY2fen2t9UurHvP6JHslOaDezhOWUpYkWZIk8+fP33Pp0qUTmZtbWbFiRebNmzf2GDOCtRyW9RyW9RyOtRyW9RyW9RzW4sWLl9da91rd41Ybxat9glL+NskLkvx5rfUPa/JrFi5cWM8999wJvS63WLZsWRYtWjT2GDOCtRyW9RyW9RyOtRyW9RyW9RxWKWWNonjOBF9knySvTvKoNQ1iAACYaiZ6TfHhSTZJcmIp5dRSyocHmAkAACbVhM4U11rvOdQgAAAwFne0AwCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCgexOK4lLK20opp5dSTi2lnFBK2W6owQAAYLJM9EzxobXW3WuteyQ5NsmbBpgJAAAm1YSiuNb6+1sdbpykTmwcAACYfKXWiXVsKeUdSZ6d5Moki2utl97O45YkWZIk8+fP33Pp0qUTel1usWLFisybN2/sMWYEazks6zks6zkcazks6zks6zmsxYsXL6+17rW6x602iksp30iyzW381OtrrV+61eMOTrJBrfXNq3vRhQsX1nPPPXd1D2MNLVu2LIsWLRp7jBnBWg7Leg7Leg7HWg7Leg7Leg6rlLJGUTxndQ+otT5mDV/z6CRfS7LaKAYAgKlkortP7HKrw/2TnDOxcQAAYPKt9kzxaryrlLIwycokP0/ywomPBAAAk2tCUVxrffJQgwAAwFjc0Q4AgO6JYgAAuieKAQDonigGAKB7ohgAgO6JYgAAuieKAQDonigGAKB7ohgA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\n",
      "text/plain": [
       "<Figure size 864x864 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt \n",
    "import numpy as np \n",
    "fig,axes=plt.subplots()\n",
    "fig.set_size_inches(12,12)\n",
    "v=np.array([2,1])\n",
    "s=np.array([-3,2])\n",
    "axes.set_xlim(-4,4)\n",
    "axes.set_ylim(-4,4)\n",
    "axes.arrow(0,0,v[0],v[1],head_length=0.1,head_width=0.1,color='blue')\n",
    "axes.arrow(0,0,s[0],s[1],head_length=0.1,head_width=0.1,color='red')\n",
    "axes.grid()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c1f8551f-0d84-4c95-988e-a76ea23789c1",
   "metadata": {},
   "source": [
    "You can see in the plot that the two vectors have different directions and magnitudes. So what happens when we add them together?\n",
    "\n",
    "Here's the formula:\n",
    "\\begin{equation}\\vec{z} = \\vec{v}+\\vec{s}\\end{equation}\n",
    "\n",
    "In terms of our vector matrices, this looks like this:\n",
    "\\begin{equation}\\vec{z} = \\begin{bmatrix}2 \\\\ 1 \\end{bmatrix} + \\begin{bmatrix}-3 \\\\ 2 \\end{bmatrix}\\end{equation}\n",
    "\n",
    "Which gives the following result:\n",
    "\\begin{equation}\\vec{z} = \\begin{bmatrix}2 \\\\ 1 \\end{bmatrix} + \\begin{bmatrix}-3 \\\\ 2 \\end{bmatrix} = \\begin{bmatrix}-1 \\\\ 3 \\end{bmatrix}\\end{equation}\n",
    "\n",
    "Let's verify that Python gives the same result:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "24e4f696-9646-4b15-9be5-b83a5ed0a2b8",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-18T06:52:31.941113Z",
     "iopub.status.busy": "2022-03-18T06:52:31.940360Z",
     "iopub.status.idle": "2022-03-18T06:52:31.945042Z",
     "shell.execute_reply": "2022-03-18T06:52:31.944455Z",
     "shell.execute_reply.started": "2022-03-18T06:52:31.941078Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "向量相加结果： [-1  3]\n"
     ]
    }
   ],
   "source": [
    "z=v+s\n",
    "print(\"向量相加结果：\",z)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "be8d34ad-f552-4df9-9e48-2b858e6b460e",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-18T06:57:29.719721Z",
     "iopub.status.busy": "2022-03-18T06:57:29.718901Z",
     "iopub.status.idle": "2022-03-18T06:57:29.958078Z",
     "shell.execute_reply": "2022-03-18T06:57:29.957463Z",
     "shell.execute_reply.started": "2022-03-18T06:57:29.719682Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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L6CztfbarNv9gTOttTf95n4DgYEAycnJLVOznqj2VUZGBomevx6E78fge37QMUQLHUN06NSp0xxrbavs7lckgH2tAaoddbtq1sf+h7V2BDACoH79+jYlJSWAXYcnLS0NHUO4fM8POoZooWPwSxAPFX4D1DXG1DLGFAX6AuMD2K6IiMjvRHzGZa09aIy5CZgMxAKvWGsXR5xMRETkGIJ4qBBr7SRgUhDbEhERORFNzhAREa+ouERExCsqLhER8YqKS0REvKLiEhERr6i4RETEKyouERHxiopLRES8ouISERGvqLhERMQrKi4REfGKiktERLyi4hIREa+ouERExCsqLhER8YqKS0REvKLiEhERr6i4RETEKyouERHxiopLRES8ouISERGvqLhERMQrKi4REfGKiktERLyi4hIREa+ouERExCsqLhER8YqKS0REvKLiEhERr6i4RETEKyouERHxiopLRES8ouISERGvqLhERMQrKi4REfGKiktERLyi4hIREa+ouERExCsqLhER8UpExWWM6W2MWWyMyTTGtAoqlIiIyPFEesa1COgJfBZAFhERkWwVieSLrbVLAYwxwaQRERHJhrHWRr4RY9KAO6y1s09wn4HAQIDk5OSWqampEe83TBkZGSQmJoYdIyK+H4Pv+UHHEC10DNGhU6dOc6y12T7tlO0ZlzFmClDpGJ8aYq19P6eBrLUjgBEA9evXtykpKTn90qiUlpaGjiFcvucHHUO00DH4Jdvistaelx9BREREckLL4UVExCuRLoe/1BizGmgDfGCMmRxMLBERkWOLdFXhe8B7AWURERHJlh4qFBERr6i4RETEKyouERHxiopLRES8ouISERGvqLhERMQrKi4REfGKiktERLyi4hIREa+ouERExCsqLhER8YqKS0REvKLiEhERr6i4RETEKyouERHxiopLRES8ouISERGvqLhERMQrKi4REfGKiktERLyi4hIREa+ouERExCsqLhER8YqKS0REvKLiEhERr6i4RETEKyouERHxiopLRES8ouISERGvqLhERMQrKi4REfGKiktERLyi4hIREa+ouERExCsqLhER8YqKS0REvKLiEhERr6i4RETEKyouERHxSkTFZYx5zBizzBizwBjznjGmdFDBREREjiXSM65PgNOttU2A5cC9kUcSERE5voiKy1r7sbX2YNbN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\n",
      "text/plain": [
       "<Figure size 504x504 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt \n",
    "import numpy as np \n",
    "fig,axes=plt.subplots()\n",
    "fig.set_size_inches(7,7)\n",
    "v=np.array([2,1])\n",
    "s=np.array([-3,2])\n",
    "axes.set_xlim(-4,4)\n",
    "axes.set_ylim(-4,4)\n",
    "axes.arrow(0,0,v[0],v[1],head_length=0.1,head_width=0.1,color='blue')\n",
    "axes.arrow(0,0,s[0],s[1],head_length=0.1,head_width=0.1,color='red')\n",
    "axes.grid()\n",
    "axes.arrow(0,0,z[0],z[1],head_length=0.1,head_width=0.1,color='green')\n",
    "axes.plot([v[0],z[0]],[v[1],z[1]],'--')\n",
    "axes.plot([s[0],z[0]],[s[1],z[1]],'--')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "94b6d7fd-e405-4fce-ad87-f317b74923a8",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-18T06:58:51.801945Z",
     "iopub.status.busy": "2022-03-18T06:58:51.801514Z",
     "iopub.status.idle": "2022-03-18T06:58:52.022522Z",
     "shell.execute_reply": "2022-03-18T06:58:52.021689Z",
     "shell.execute_reply.started": "2022-03-18T06:58:51.801911Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "向量相减结果： [ 5 -1]\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAa4AAAGfCAYAAAAH0zaSAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzt3Xd4FVX+x/H3SSGU0Ak19BI6EhAQFAICIrKyK0UECxpkbchaVlF0XduuigVwVywB1BVkwS6r8EM0gAqohF4CiiggVUWIAgFyfn+cFFQgQG4ynOTzep483jszd+bLEe4nM3PmHGOtRURExBdhQRcgIiJyKhRcIiLiFQWXiIh4RcElIiJeUXCJiIhXFFwiIuKVkASXMaacMeY1Y8w6Y8xaY8w5odiviIjIb0WEaD/jgFnW2v7GmGJAyRDtV0RE5FdMXh9ANsaUBZYB9ayeZhYRkXwWijOuusAuYLIxphWwBBhprf356I2MMcOB4QDFixdvU6tWrRAc2l8ZGRmEhRXtW4xqA7UBqA1AbZBl/fr1u621MbltF4ozrrbAIqCTtXaxMWYcsNdae+/xPhMXF2dTU1PzdFzfJScnk5CQEHQZgVIbqA1AbQBqgyzGmCXW2ra5bReKiN8CbLHWLs58/xoQH4L9ioiI/E6eg8taux3YbIyJy1x0PrAmr/sVERE5llD1KhwBTMnsUbgRuDpE+xUREfmVkASXtXYZkOt1SRERkbxSNxYREfGKgktERLyi4BIREa8ouERExCsKLhER8YqCS0REvKLgEhERryi4RETEKwouERHxioJLRES8ouASERGvKLhERMQrCi4REfGKgktERLyi4BIREa8ouERExCsKLhER8YqCS0REvKLgEhERryi4RETEKwouERHxioJLRES8ouASERGvKLhERMQrCi4REfGKgktERLyi4BIREa8ouERExCsKLhER8YqCS0REvKLgEhERryi4RETEKwouERHxioJLRES8ouASERGvKLhERMQrCi4REfGKgktERLyi4BIREa8ouERExCsKLhER8YqCS0REvKLgEhERryi4RETEKwouERHxioJLRES8ouASERGvKLhERMQrCi4REfGKgktERLyi4BIREa8ouERExCsKLhER8YqCS0REvKLgEhERr4QsuIwx4caYpcaYmaHap4iIyG+F8oxrJLA2hPsTERH5nZAElzEmFrgISArF/kRERI7HWGvzvhNjXgP+CZQGbrfW9jnGNsOB4QAxMTFtpk+fnufj+iwtLY3o6OigywiU2kBtAGoDUBtk6dq16xJrbdvctovI64GMMX2AndbaJcaYhONtZ619HngeIC4uziYkHHfTIiE5ORm1gdpAbaA2ALXBqQrFpcJOwMXGmE3ANKCbMeaVEOxXRETkd/IcXNbau6y1sdbaOsAg4ENr7eV5rkxEROQY9ByXiIh4Jc/3uI5mrU0GkkO5TxERkaPpjEtERLyi4BIREa8ouERExCsKLhER8YqCS0REvKLgEhERryi4RETEKwouERHxioJLRES8ouASERGvKLhERMQrCi4REfGKgktERLyi4BIREa8ouERExCsKLhER8YqCS0REvKLgEhERryi4RETEKwouERHxioJLRES8ouASERGvKLhERMQrCi4REfGKgktERLyi4BIREa8ouERExCsKLhER8YqCS0REvKLgEhERryi4RETEKwouERHxioJLRES8ouASERGvKLhERMQrCi4REfGKgktERLyi4BIREa8ouERExCsKLhER8YqCS0REvKLgEhERryi4RETEKwouERHxioJLRES8ouASERGvKLhERMQrCi4REfGKgktERLyi4BIREa8ouERExCsKLhER8YqCS0REvKLgEhERr+Q5uIwxNY0xHxlj1hhjVhtjRoaiMMkHhw/D99+DtUFXIiJy2kJxxnUYuM1a2xToANxojGkagv1KqL38MlSqBCVKQK1acPPNQVckInLK8hxc1tpt1tqUzNf7gLVAjbzuV/JBnz5QqhQcPAj7v4OfFkP6L0FXJSJySowN4WUjY0wdYD7Q3Fq79zfrhgPDAWJiYtpMnz49ZMf1UVpaGtHR0QV/4B07YOtWah9Ipm76PA6bKHZV6cSOKl3ZU645mIK77RlYG5xB1AZqA1AbZOnatesSa23b3LYLWXAZY6KBecDD1to3TrRtXFycTU1NDclxfZWcnExCQkLBH/jQIRgwAEbcBK8/DVv/D5pGQpSBSo3ghsUQVjDhFVgbnEHUBmoDUBtkMcacVHBFhOhgkcDrwJTcQksCFhkJb73lXp/fHb75BhrUgbgI6FkyJ7Te+DNUbw3N+0F0TGDlioj8Vih6FRpgIrDWWvtk3kuSAlW7Nhyy8KdR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\n",
      "text/plain": [
       "<Figure size 504x504 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt \n",
    "import numpy as np \n",
    "z=v-s\n",
    "print(\"向量相减结果：\",z)\n",
    "fig,axes=plt.subplots()\n",
    "fig.set_size_inches(7,7)\n",
    "v=np.array([2,1])\n",
    "s=np.array([-3,2])\n",
    "axes.set_xlim(-6,6)\n",
    "axes.set_ylim(-6,6)\n",
    "axes.arrow(0,0,v[0],v[1],head_length=0.1,head_width=0.1,color='blue')\n",
    "axes.arrow(0,0,s[0],s[1],head_length=0.1,head_width=0.1,color='red')\n",
    "axes.grid()\n",
    "axes.arrow(0,0,z[0],z[1],head_length=0.1,head_width=0.1,color='green')\n",
    "axes.plot([v[0],z[0]],[v[1],z[1]],'--')\n",
    "axes.plot([s[0],z[0]],[s[1],z[1]],'--')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8d42bf74-338f-4a8f-a18c-4cbd34c58d55",
   "metadata": {},
   "source": [
    "So what's going on here?\n",
    "Well, we added the dimensions of **s** to the dimensions of **v** to describe a new vector **z**. Let's break that down:\n",
    "- The dimensions of **v** are (2,1), so from our starting point we move 2 units in the *x* dimension (across to the right) and 1 unit in the *y* dimension (up). In the plot, if you start at the (0,0) position, this is shown as the red arrow.\n",
    "- Then we're adding **s**, which has dimension values (-3, 2), so we move -3 units in the *x* dimension (across to the left, because it's a negative number) and then 2 units in the *y* dimension (up). On the plot, if you start at the head of the red arrow and make these moves, you'll end up at the head of the green arrow, which represents **z**.\n",
    "\n",
    "The same is true if you perform the addition operation the other way around and add **v** to **s**, the steps to create **s** are described by the blue arrow, and if you use that as the starting point for **v**, you'll end up at the head of the green arrow, which represents **z**.\n",
    "\n",
    "Note on the plot that if you simply moved the tail of the blue arrow so that it started at the head of red arrow, its head would end up in the same place as the head of the green arrow; and the same would be true if you moved tail of the red arrow to the head of the blue arrow."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ab0c579c-5642-402b-b8e7-adb0ae6db3c8",
   "metadata": {},
   "source": [
    "## Vector Multiplication 向量乘法\n",
    "Vector multiplication can be performed in three ways:\n",
    "\n",
    "- Scalar Multiplication\n",
    "- Dot Product Multiplication\n",
    "- Cross Product Multiplication\n",
    "\n",
    "## Scalar Multiplication 标量相乘\n",
    "Let's start with *scalar* multiplication - in other words, multiplying a vector by a single numeric value.\n",
    "\n",
    "Suppose I want to multiply my vector by 2, which I could write like this:\n",
    "\n",
    "\\begin{equation} \\vec{w} = 2\\vec{v}\\end{equation}\n",
    "\n",
    "Note that the result of this calculation is a new vector named **w**. So how would we calculate this?\n",
    "Recall that **v** is defined like this:\n",
    "\n",
    "\\begin{equation}\\vec{v} = \\begin{bmatrix}2 \\\\ 1 \\end{bmatrix}\\end{equation}\n",
    "\n",
    "To calculate 2v, we simply need to apply the operation to each dimension value in the vector matrix, like this:\n",
    "\n",
    "\\begin{equation}\\vec{w} = \\begin{bmatrix}2 \\cdot 2 \\\\  2 \\cdot 1 \\end{bmatrix}\\end{equation}\n",
    "\n",
    "Which gives us the following result:\n",
    "\n",
    "\\begin{equation}\\vec{w} = \\begin{bmatrix}2 \\cdot 2 \\\\  2 \\cdot 1 \\end{bmatrix} = \\begin{bmatrix}4 \\\\ 2 \\end{bmatrix}\\end{equation}\n",
    "\n",
    "In Python, you can apply these sort of matrix operations directly to numpy arrays, so we can simply calculate **w** like this:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "5d1d0f57-5be6-4ae1-954e-27ae0bf71e38",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-18T07:29:51.564772Z",
     "iopub.status.busy": "2022-03-18T07:29:51.564013Z",
     "iopub.status.idle": "2022-03-18T07:29:51.756883Z",
     "shell.execute_reply": "2022-03-18T07:29:51.756041Z",
     "shell.execute_reply.started": "2022-03-18T07:29:51.564738Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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uuKqte4xqEEAYGN45wwAmiJcADRFuABoinAB0BThAqApwgVAU4QLgKYIFwBNES4AmiJcADRFuABoinAB0BThAqApwgVAU4QLgKYIFwBNES4AmiJcADRFuABoinAB0BThAqApwgVAU4QLgKYIFwBNES4AmiJcADRFuABoinAB0BThAqApwgVAU4QLgKYIFwBNES4AmiJcADRFuABoinAB0BThAqApwgVAU4QLgKYIFwBNES4AmiJcADRFuABoinAB0BThAqApwgVAU4QLgKYIFwBNES4AmiJcADRFuABoinAB0BThAqApwgVAU4QLgKYIFwBNES4AmiJcADRFuABoinAB0BThAqApwgVAU4QLgKYIFwBNES4AmiJcADRFuABoykDCVUr5aCmlllJ2HMTxAGBdJh2uUsouSV6X5NeTHwcA1m8QV1xfSvLxJHUAxwKA9ZpUuEopb0pyR631ugHNAwDrVWpd/4VSKeXCJM9fyy+dmuSUJK+rtT5QSrktyWit9d51HOfYJMcmyZw5c+YvXLhwMnM/Y1auXJmRkZGux2iOdeuPdeuPdevPsK/bggULltRaRze03wbDtc7fWMq+SS5K8oc1X5qb5M4k+9da717f7x0dHa2LFy/u67zPtPHx8YyNjXU9RnOsW3+sW3+sW3+Gfd1KKRsVrln9nqDW+oskOz3phLdlPVdcADAIXscFQFP6vuJ6ulrrvEEdCwDWxRUXAE0RLgCaIlwANEW4AGiKcAHQFOECoCnCBUBThAuApggXAE0RLgCaIlwANEW4AGiKcAHQFOECoCnCBUBThAuApggXAE0RLgCaIlwANEW4AGiKcAHQFOECoCnCBUBThAuApggXAE0RLgCaIlwANEW4AGiKcAHQFOECoCnCBUBThAuApggXAE0ptdbNf9JS7kly+2Y/8cbZMcm9XQ/RIOvWH+vWH+vWn2FftxfVWp+3oZ06CdcwK6UsrrWOdj1Ha6xbf6xbf6xbf6bKunmoEICmCBcATRGuP3dm1wM0yrr1x7r1x7r1Z0qsm+e4AGiKKy4AmiJc61FK+WgppZZSdux6lhaUUj5fSrmhlPLzUsr3SinbdT3TMCulHFFKubGUclMp5aSu52lBKWWXUsqiUsr1pZSlpZQTu56pJaWUmaWUa0opP+x6lskQrnUopeyS5HVJft31LA25IMk+tdb9kvwqyckdzzO0Sikzk5yR5Mgkeyd5Zyll726nasKqJB+tte6d5MAkx1u3TXJikmVdDzFZwrVuX0ry8SSeBNxItdaf1FpXrdm8IsncLucZcvsnuanWekut9bEkC5O8qeOZhl6t9a5a69Vrfv5Qet+Ed+52qjaUUuYmOSrJ17qeZbKEay1KKW9Kcket9bquZ2nY+5L8qOshhtjOSX7zpO3l8Q14k5RS5iV5RZIru52kGV9O7x/jE10PMlmzuh6gK6WUC5M8fy2/dGqSU9J7mJCnWd+61Vq/v2afU9N7SOdbm3M2po9SykiS7yT5cK31wa7nGXallKOT/K7WuqSUMtb1PJM1bcNVa33t2r5eStk3yYuTXFdKSXoPd11dStm/1nr3ZhxxKK1r3f6klHJMkqOTHF691mJ97kiyy5O25675GhtQStkivWh9q9b63a7nacQhSd5YSnl9kq2SPKeU8s+11nd1PFdfvI5rA0optyUZrbUO8xtTDoVSyhFJvpjksFrrPV3PM8xKKbPSu4Hl8PSCdVWSv661Lu10sCFXev+a/GaS+2qtH+56nhatueL6WK316K5n6ZfnuBikryTZJskFpZRrSyn/2PVAw2rNTSwnJPlxejcYfFu0NsohSd6d5DVr/o5du+YqgmnEFRcATXHFBUBThAuApggXAE0RLgCaIlwANEW4AGiKcAHQFOECoCn/H8z5lYwu5Tk+AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 504x504 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np \n",
    "import matplotlib.pyplot as plt \n",
    "w=2*v\n",
    "fig,axes=plt.subplots()\n",
    "fig.set_size_inches(7,7)\n",
    "v=np.array([2,1])\n",
    " \n",
    "axes.set_xlim(-5,5)\n",
    "axes.set_ylim(-5,5)\n",
    "axes.arrow(0,0,v[0],v[1],head_length=0.1,head_width=0.1,color='blue')\n",
    "axes.arrow(0,0,w[0],w[1],head_length=0.1,head_width=0.1,color='red')\n",
    "axes.grid()\n",
    " \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2dc00234-d64a-49f4-8253-574977194e6a",
   "metadata": {},
   "source": [
    "The same approach is taken for scalar division.\n",
    "\n",
    "Try it for yourself - use the cell below to calculate a new vector named **b** based on the following definition:\n",
    "\n",
    "\\begin{equation}\\vec{b} = \\frac{\\vec{v}}{2}\\end{equation}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "940875bb-3ae1-466e-8c05-99af3b3eea04",
   "metadata": {},
   "source": [
    "## Dot Product Multiplication 点击（内积）\n",
    "向量（注意不是矩阵）的内积可以理解为一个与平面有 $ \\theta$ 夹角的力$ v $，与平面上的力$ u $ 的合力\n",
    "\n",
    "So we've seen how to multiply a vector by a scalar. How about multiplying two vectors together? There are actually two ways to do this depending** on whether you want the result to be a *scalar product* (in other words, a number) or a *vector product* (a vector).**\n",
    "> 使用内积，得到的是一个标量，其几何意义为 $ u \\cdot v=|u||v|cos\\theta $ 表示向量u在向量v方向上的投影长度乘向量v的模长。 如果v是单位向量，内积就可以直接描述为向量u在向量v方向上的投影长度\n",
    "\n",
    "To get a scalar product, we calculate the *dot product*. This takes a similar approach to multiplying a vector by a scalar, except that it multiplies each component pair of the vectors and sums the results. To indicate that we are performing a dot product operation, we use the &bull; operator:\n",
    "\n",
    "\\begin{equation} \\vec{v} \\cdot \\vec{s} = (v_{1} \\cdot s_{1}) + (v_{2} \\cdot s_{2}) ... + \\; (v_{n} \\cdot s_{n})\\end{equation}\n",
    "\n",
    "So for our vectors **v** (2,1) and **s** (-3,2), our calculation looks like this:\n",
    "\n",
    "\\begin{equation} \\vec{v} \\cdot \\vec{s} = (2 \\cdot -3) + (1 \\cdot 2) = -6 + 2 = -4\\end{equation}\n",
    "\n",
    "So the dot product, or scalar product, of **v** &bull; **s** is **-4**.\n",
    "\n",
    "In Python, you can use the *numpy.**dot*** function to calculate the dot product of two vector arrays:\n",
    ">很重要的一点是：向量A与向量B的点积 并不等于 向量B与向量A的点积，我们用A·B表示两个向量的点积运算，则A·B!=B·A\n",
    "\n",
    ">假如要计算 A·B，那么，A(点击号前面的向量)中x方向元素的数量应该于B(点积号后面的向量)中y方向的数量相同"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "b38c3bc8-9656-42a0-b68d-0839fcc1fcfd",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-19T08:14:33.920173Z",
     "iopub.status.busy": "2022-03-19T08:14:33.919743Z",
     "iopub.status.idle": "2022-03-19T08:14:33.927347Z",
     "shell.execute_reply": "2022-03-19T08:14:33.926711Z",
     "shell.execute_reply.started": "2022-03-19T08:14:33.920142Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "18\n",
      "18\n",
      "多维度向量内积结果 [[18 16]\n",
      " [12 20]]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np \n",
    "import matplotlib.pyplot as plt  \n",
    "v=np.array([2,3,3])\n",
    "u=np.array([3,5,-1])\n",
    "s=np.dot(u,v)\n",
    "s1=np.dot(v,u)\n",
    "print(s)\n",
    "print(s1)\n",
    "# 内积也可以用@ 代替,以下为矩阵的内积\n",
    "v2=np.array([2,3,3,3,2,1]).reshape(2,3)\n",
    "u2=np.array([3,5,-1,3,5,-1]).reshape(3,2)\n",
    "print(\"多维度向量内积结果\", v2@u2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "34088a65-1f76-464c-8e85-c368bf52baa9",
   "metadata": {},
   "source": [
    "### The Cosine Rule\n",
    "An useful property of vector dot product multiplication is that we can use it to calculate the cosine of the angle between two vectors. We could write the dot products as:\n",
    "\n",
    "$$ \\vec{v} \\cdot \\vec{s} = \\|\\vec{v} \\|\\|\\vec{s}\\| \\cos (\\theta) $$ \n",
    "\n",
    "Which we can rearrange as:\n",
    "\n",
    "$$ \\cos(\\theta) = \\frac{\\vec{v} \\cdot \\vec{s}}{\\|\\vec{v} \\|\\|\\vec{s}\\|} $$\n",
    "\n",
    "So for our vectors **v** (2,1) and **s** (-3,2), our calculation looks like this:\n",
    "\n",
    "$$ \\cos(\\theta) = \\frac{(2 \\cdot-3) + (-3 \\cdot 2)}{\\sqrt{2^{2} + 1^{2}} \\times \\sqrt{-3^{2} + 2^{2}}} $$\n",
    "\n",
    "So:\n",
    "\n",
    "$$\\cos(\\theta) = \\frac{-4}{8.0622577483}$$\n",
    "\n",
    "Which calculates to:\n",
    "\n",
    "$$\\cos(\\theta) = -0.496138938357 $$\n",
    "\n",
    "So:\n",
    "\n",
    "$$\\theta \\approx 119.74 $$\n",
    "\n",
    "Here's that calculation in Python:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "33cc47e3-d9f9-454e-bdeb-f9e62ebce70f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-19T08:24:49.392262Z",
     "iopub.status.busy": "2022-03-19T08:24:49.391779Z",
     "iopub.status.idle": "2022-03-19T08:24:49.399146Z",
     "shell.execute_reply": "2022-03-19T08:24:49.398614Z",
     "shell.execute_reply.started": "2022-03-19T08:24:49.392218Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.23606797749979 3.605551275463989\n",
      "2.0899424410414196\n",
      "角度为 119.74488129694222\n"
     ]
    }
   ],
   "source": [
    "import numpy as np \n",
    "u=np.array([2,1])\n",
    "v=np.array([-3,2])\n",
    "# 计算u，v 向量的范数\n",
    "u_norm=np.linalg.norm(u)\n",
    "v_norm=np.linalg.norm(v)\n",
    "print(u_norm,v_norm)\n",
    "u_v_dot=np.dot(u,v)\n",
    "#u_v_dot=|v||u|cos()\n",
    "cos_t=u_v_dot/(u_norm*v_norm)\n",
    "theta=np.arccos(cos_t)\n",
    "print(theta)\n",
    "print(\"角度为\",np.degrees(theta))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1d79fa8d-4051-4467-9abb-7d1dfdeb893f",
   "metadata": {},
   "source": [
    "## Cross Product Multiplication 向量的外积（叉积）\n",
    "向量的外积cross得到的\n",
    "To get the *vector product* of multipying two vectors together, you must calculate the *cross product*. The result of this is a new vector that is at right angles to both the other vectors in 3D Euclidean space. This means that the cross-product only really makes sense when working with vectors that contain three components.\n",
    "\n",
    "For example, let's suppose we have the following vectors:\n",
    "\n",
    "\\begin{equation}\\vec{p} = \\begin{bmatrix}2 \\\\ 3 \\\\ 1 \\end{bmatrix}\\;\\; \\vec{q} = \\begin{bmatrix}1 \\\\ 2 \\\\ -2 \\end{bmatrix}\\end{equation}\n",
    "\n",
    "To calculate the cross product of these vectors, written as **p** x **q**, we need to create a new vector (let's call it **r**) with three components (r<sub>1</sub>, r<sub>2</sub>, and r<sub>3</sub>). The values for these components are calculated like this:\n",
    "\n",
    "\\begin{equation}r_{1} = p_{2}q_{3} - p_{3}q_{2}\\end{equation}\n",
    "\\begin{equation}r_{2} = p_{3}q_{1} - p_{1}q_{3}\\end{equation}\n",
    "\\begin{equation}r_{3} = p_{1}q_{2} - p_{2}q_{1}\\end{equation}\n",
    "\n",
    "So in our case:\n",
    "\n",
    "\\begin{equation}\\vec{r} = \\vec{p} \\times \\vec{q} = \\begin{bmatrix}(3 \\cdot -2) - (1 \\cdot 2) \\\\ (1 \\cdot 1) - (2 \\cdot -2) \\\\ (2 \\cdot 2) - (3 \\cdot 1) \\end{bmatrix} = \\begin{bmatrix}-6 - 2 \\\\ 1 - -4 \\\\ 4 - 3 \\end{bmatrix} = \\begin{bmatrix}-8 \\\\ 5 \\\\ 1 \\end{bmatrix}\\end{equation}\n",
    "\n",
    "In Python, you can use the *numpy.**cross*** function to calculate the cross product of two vector arrays:\n",
    "\n",
    "---\n",
    "在二维平面中，向量$v$ 与向量 $u$ 的cross运算法则为：\n",
    "$$ u\\times v =\\begin{bmatrix} u_1 \\\\ u_2 \\end{bmatrix} \\times \\begin{bmatrix}v_1\\\\v_2 \\end{bmatrix}=u_1v_2-u_2v_1 $$\n",
    "\n",
    "在二维平面中，向量的cross表示两个相连章草的平行四边形的“面积”，当然如果如果两个向量的夹角大于180，那么相连外积运算得到的结果为负数。\n",
    "\n",
    "在三维空间中，cross的结果也是有明确的物理含义的，即表示$u$ 和$v$ 两个向量张成平面的法向量。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "bf0c66ad-244b-4167-98ab-7a1f3038cbcd",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-19T09:15:04.369767Z",
     "iopub.status.busy": "2022-03-19T09:15:04.369031Z",
     "iopub.status.idle": "2022-03-19T09:15:04.375692Z",
     "shell.execute_reply": "2022-03-19T09:15:04.374901Z",
     "shell.execute_reply.started": "2022-03-19T09:15:04.369735Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "7\n",
      "[ -1 -12   7]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np \n",
    "u=np.array([2,1])\n",
    "v=np.array([-3,2])\n",
    "u_v_cross=np.cross(u,v)\n",
    "print(u_v_cross)\n",
    "# 三维向量的外积\n",
    "u2=np.array([2,1,2])\n",
    "v2=np.array([-3,2,3])\n",
    "print(np.cross(u2,v2))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "70caf819-7608-447c-83c8-92574a9c0557",
   "metadata": {},
   "source": [
    "## 线性相关\n",
    "当且仅当一组向量$ v_1,v_2,v_3...,v_n$ 中任一个向量可以表示为其他向量的线性组合时，称这组向量为线性相关的，否则是线性无关。\n",
    "\n",
    "应用零向量的概念，线性相关可以定义为：一组m-向量$v_1,v_2,..v_n$ 是线性相关的，当且仅当存在一组标量，$k_1,k_2...k_n$ （不全为0）使得：\n",
    "   $$ \\sum^{n}_{i=1}{k_iv_i}=0 $$\n",
    "  \n",
    "  另一方面，如果对所有的$i$，仅当$k_i=0$ 时，上述方程才成立，则这些向量是线性无关的。\n",
    " \n",
    " > 几何意义上，二维空间线性相关可以表示为两个线性无关向量$ v,u$ 的线性组合\n",
    " \n",
    " ## 向量空间\n",
    " \n",
    " 两个线性无关的向量 $ u,v$ 的各种线性组合生成的所有2维向量的全体称为2维向量空间。\n",
    " \n",
    " >张成空间:\n",
    " >进一步扩展，对于一组线性无关向量，由他们所有线性组合所构成的空间就称为这组向量所**张成** 的空间。\n",
    " \n",
    " >基：当一组线性无关向量张成了一个空间时，也可以说这一组向量构成了该空间的某一个**基** ,例如\n",
    " $$ e_1= \\begin{bmatrix} 1\\\\0\\\\0 \\end{bmatrix}, e_2=\\begin{bmatrix} 0\\\\1\\\\0 \\end{bmatrix},e_3=\\begin{bmatrix} 0\\\\0\\\\1 \\end{bmatrix}$$\n",
    " 就构成了三维空间$ R^3$ 的一个单位基向量。实际上，n-空间可以由全部线性无关的n个单位相连全体构成。\n",
    " \n",
    " * 如果二维空间两个向量 $v,u$ 线性相关，那么两个向量就在一条直线上。\n",
    " * 如果三维空间三个向量线性相关，$ v,u,w $ 也意味这有个向量可以被其他向量线性表达，例如 $ w=av+bu $ 那么3个向量构成了一个平面，或直接退化成一条直线。\n",
    " "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "4a4b6c73-9d94-48bf-86a0-01f40c36eeba",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-22T07:19:46.122998Z",
     "iopub.status.busy": "2022-03-22T07:19:46.121891Z",
     "iopub.status.idle": "2022-03-22T07:19:46.479546Z",
     "shell.execute_reply": "2022-03-22T07:19:46.478690Z",
     "shell.execute_reply.started": "2022-03-22T07:19:46.122955Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.patches.FancyArrow at 0x7f0a60c4a150>"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAecAAAHLCAYAAADyY1AZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzt3Xt8VNW9Pv5nJ5NMrjOTZAARrIihINcIQfR81aoVEFTUigWqlR5p67V6vNtzakFrvfTCT1vr7VSrcnqglaNiFQVBOdUWS4PgqdjDQautRsBkcp8kk5nM+v0xzMglISHZK3utD8/79fI1JhlW1pPPnqzMXnuv5SilQERERObI8roDREREtC8OzkRERIbh4ExERGQYDs5ERESG4eBMRERkGA7OREREhuHgTDQAHMd5wnGczxzHeXevz5U6jvOq4zg79jyWdPNvF+55zg7HcRYOXK+JyCscnIkGxpMAztrvc7cBWK+UGgVg/Z6P9+E4TimAxQCmATgBwOLuBnEikoODM9EAUEr9HkDdfp8+D8BTe/7/KQDnd/FPZwJ4VSlVp5SqB/AqDhzkiUgYDs5E3hmilNq55/93ARjSxXOGAfh4r48/2fM5IhLMp6vh2tpalV4atLCwED6fD42NjQCA3NxcBAIB1NbWAgAcx0E4HEZDQwPi8TgAoKSkBLFYDK2trQCAoqIiZGdnZ9rw+/0oLi7OtJGVlYWysjLU19cjkUgAAEpLS9HW1oa2tjYAQHFxMRzHQVNTEwAgLy8PhYWFiEQiAIDs7GyUlpairq4OnZ2dAICysjJEo1G0t7cDAAKBAJRSqKmpQV5eHvLz85Gfn4+6utSbIp/Ph5KSEkQiESSTSQBAOBxGc3MzYrEYACAYDKKzsxMtLS0AgIKCAvj9ftTX1wMAcnJyEAqFUFtbi/TPMBwOo6mpCR0dHZk2EokEotFo5meck5ODhoaGzM84GAxm2kj/jBsbGzNthEIhxOPxfdpI16m9vR2BQMD6OjU3NwPAAXWKx+M48sgjB7ROVVVV+PrXv454PK4aGhoQCATQ2NiogsEgampqUF5ejtraWrV3nRYvXgzHcdDa2vqDaDSKW2+9FYFAAB0dHT/e//W0dOlSLFu2DADQ0dGBP/7xj9bXqavXU0FBATo7O616Pe1dp55eT+l+216n7l5PtbW1yMvLs75O3b2eBg0a5MAFjq61tWtqatSgQYO0tG2CmpoaMJ+9vMj30Ucf4ZxzzsG776auCRs9ejQ2bNiAoUOHYufOnTjttNOwffv2ff7N8uXLsWHDBjz66KMAgMsvvxynnXYaFixYcNDvVVFRga1bt+oJ4jEem3aTng+AK4MzT2sTeWTOnDl46qnUlPNTTz2F884774DnzJw5E2vXrkV9fT3q6+uxdu1azJw5c6C7SkQDTNvgHA6HdTVtBOaz20DnW7BgAU466SRs374dw4cPx+OPP47bbrsNr776KkaNGoV169bhtttSF2tXVVXhm9/8JoDUKcrbb78dU6dOxdSpU/H9738fpaWlPX4/n0/bjJXneGzaTXo+t2g7rZ2eS5OqsbERzGcv6fmOP/54bNmyxetuaCG9dsxnPbNPa6cn36ViPrtJzyd5n3bptWM+AjjnTEREZBxtg7Pw0xbMZznp+bKzs73ugjbSa8d8BGgcnNP33EnFfHaTnk/yaW3ptWM+AjQOzukbvKViPrtJz5deCEIi6bVjPgI450xERGQcbYNzYWGhrqaNwHx2k54vK0vu393Sa8d8BGgcnHNycnQ1bQTms5v0fI7jyq2WRpJeO+YjQOPgnF6IXCrms5v0fOkNDCSSXjvmI4BzzkRERMbRNjjn5ubqatoIzGc36fkkn9aWXjvmI0Dj2toA5N5oSWS4yspKVFVVed0NosOR2Wtrpzeqlor57CY9n+SFHqTXjvkI0Dg4S16hCGA+20nPJ5n02jEfARoHZ8lzXgDz2U56Psmk1475COCcM5FInHMm8ozZc86NjY26mjYC89lNej7J9zlLrx3zEaBxcJa+oTbz2U16PsnzetJrx3wEcBESIiIi42gbnEOhkK6mjcB8dpOeLzs72+suaCO9dsxHgMbBOR6P62raCMxnN+n5JJ/Wll475iNA4+AsfUNt5rOb9HzJZNLrLmgjvXbMRwDnnImIiIyjbXCWvqE289lNer6sLLl/d0uvHfMRoHFw9vl8upo2AvPZTXo+yaswSa8d8xHARUj6jPnsJj0fFyGxF/MRwDlnIiIi42gbnKVvqM18dpOeT/Jpbem1Yz4CNA7OgUBAV9NGYD67Sc8neRES6bVjPgI0Ds7SN9RmPrtJz5dIJLzugjbSa8d8BHDOmYiIyDjaBmfJc14A89lOej7JpNeO+QgAHI1r8Mpd3JfIcJWVlaiqqvK6G0SHI1f++tD2zrmhoUFX00ZgPrtJzyf5PmfptWM+ArgrVZ8xn92k5+OuVPZiPgJ4QRgREZFxtA3OJSUlupo2AvPZTXo+yfc5S68d8xGgcXCOxWK6mjYC89lNej7Jp7Wl1475CNA4OLe2tupq2gjMZzfp+ZLJpNdd0EZ67ZiPAM45ExERGUfb4FxUVKSraSMwn92k58vKkvt3t/TaMR8BGgdnyRekAMxnO+n5JK/CJL12zEeAxsFZ+obazGc36fkkL0IivXbMRwDnnImIiIyjbXD2+/26mjYC89lNej7Jp7Wl1475CNA4OBcXF+tq2gjMZzfp+STP60mvHfMRoHFwlr6hNvPZzYR827dvR0VFRea/QCCA+++/f5/nbNiwAcFgMPOcO++8s1dtJxIJHV02ggm104n5CAB8XneA6HA1evRobN26FUDqAq5hw4bhggsuOOB5p5xyCl588cWB7h4ReUjbO2fJ91kCzGc70/KtX78exx57LI4++mivu2I802rnNuYjQOM75/z8fNTU1AAACgsL4fP5MpfQ5+bmIhAIZE5vOI6DcDiMhoaGzHZiJSUliMVimaXeioqKkJ2dnWnD7/ejuLg400ZWVhbKyspQX1+fOaVXWlqKtrY2tLW1AUjNdTiOg6amJgBAXl4eCgsLEYlEAKTm6UpLS1FXV5e5FaWsrAzRaBTt7e0AgEAgAKUUkskkampqkJ+fj/z8fNTV1aV+oD4fSkpKEIlEMksohsNhNDc3Z9aUDQaD6OzsREtLCwCgoKAAfr8f9fX1AICcnByEQiHU1tZm1kgOh8NoampCR0dHpo1EIoFoNJr5Gefk5GT2Ss3NzUUwGMy0kf4ZNzY2ZtoIhUKIx+P7tLF3nRobG62vU3Nzc+Z43L9OAIyp05NPPolzzz0XtbW1+9SpoaEBGzduxIQJEzB48GAsWbIEU6ZM6fL1tHTpUixbtgwAUF9fL6ZOXb2empqarHs99fb3Xl5eXuZ3p+116ur1lP7daXuduns9DRo0CG5wdC2QX19fryTvPlJfXy96dxXmGzgdHR048sgjsW3bNgwZMmSfrzU1NSErKwtFRUVYvXo1rrvuOuzYsaPHNo8//nhs2bJFV5c9ZVLtdGA+67lyq4S28wuSL0gBmM92JuV7+eWXMXny5AMGZiD1jiW93OHs2bMRj8d7dUGN5F2pTKqdDsxHABchIfLc8uXLsWDBgi6/tmvXrsxAu2nTJiSTSZSVlQ1k94jIA9rmnEtLS3U1bQTms5sp+aLRKF599VU8+uijmc898sgjAIArrrgCK1euxMMPPwyfz4f8/HysWLGiVwuMpOfUJTKldrowHwEa55xbWlqU5N1HWlpaRO+uwnx2mzx5Mt5++22vu6GF9Noxn/XMnnNOXykoFfPZTXq+9BWzEkmvHfMRwDlnIiIi43Bt7T5iPrtJz8e1te3FfARoHJwl74oDMJ/tpOeTTHrtmI8AjYNzejUaqZjPbtLzpVd6kkh67ZiPAM45ExERGUfb4JyXl6eraSMwn92k55O8uYD02jEfARoH58LCQl1NG4H57CY9n+TBWXrtmI8AjYNzescTqZjPbtLzSV6/WHrtmI8AzjkTEREZR9vgLPk+S4D5bCc9n2TSa8d8BGhcWxuA3D3riAxXWVmJqqoqr7tBdDgye23turo6XU0bgfnsJj2f5Dln6bVjPgI0Ds6SF0EAmM920vNJJr12zEcALwgjIiIyjrY552QyqSTfa5lMJkXfS8p8dpM85yy9dsxnPbPnnKPRqK6mjcB8dpOeT/J+ztJrx3wEaByc29vbdTVtBOazm/R8kgdn6bVjPgI450xERGQcbYNzIBDQ1bQRmM9u0vNJXuhBeu2YjwCNg7PGxU2MwHx2k55PMum1Yz4CNA7Ozc3Nupo2AvPZTXo+yfeSSq8d8xHAOWciIiLjaBuc8/PzdTVtBOazm/R8ku8jlV475iOAg3OfMZ/dpOfj4Gwv5iOAG1/0GfPZTXo+bnxhL+YjgHPORERExtE2OPt8Pl1NG4H57CY9n+O4sryvkaTXjvkI0LjxBQDezEbkEckbXxAZzuyNLyKRiK6mjcB8dpOeT/Kcs/TaMR8BGgdnyQvvA8xnO+n5JJNeO+YjgBeEERERGUfbnLNSSkm+KEUpJfqiG+azm+Q5Z+m1Yz7rmT3nLH39VOazm/R8XFvbXsxHgMbBORaL6WraCMxnN+n5JO/8I712zEcA55yJiIiMo21wDgaDupo2AvPZTXq+7Oxsr7ugjfTaMR8BGgdnyXNeAPPZTno+yae1pdeO+QjQODi3tLToatoIzGc36fkk30sqvXbMRwDnnImIiIyjbXAuKCjQ1bQRmM9u0vNJ3s9Zeu2YjwCNg7Pf79fVtBGYz27S80le5EF67ZiPAI2Dc319va6mjcB8dpOez7qLbpQCnnsOmDoV+NOfDvpU6bVjPgI450xEXlu/Hhg/Hvj614GqKuBnP/O6R0Se07brdU5Ojq6mjcB8dpOez4rT2ps2AddeC/zlL0Br6+efX7UKiMeBbmokvXbMR4DGd86hUEhX00ZgPruZlG/EiBGYMGECKioqUFlZecDXlVK49tprUV5ejokTJ+Ltt9/usU2jFyF57z1g5kzgtNNSp7D3HpgBICsLeP31bv+5SbXTgfkI0Dg419bW6mraCMxnN9Pyvf7669i6dWuXO0m9/PLL2LFjB3bs2IHHHnsMV155ZY/tJRIJHd3sv927U6ew164F2tq6fk5zM/DUU902YVrt3MZ8BGgcnCWvUAQwn+1syrdq1SpceumlcBwHJ554IhoaGrBz506vu9U3gwalLvz60pcAvz/1X1fSp7a7YFPt+oL5COAFYUSecxwHM2bMwJQpU/DYY48d8PXq6mocddRRmY+HDx+O6urqgeyie7KygPPOAzZsAD74APjXf+3+ea+9NqBdIzKJtgvCCgoKUFNTAwAoLCyEz+dDY2MjACA3NxeBQCBzesNxHITDYTQ0NCC+56/lkpISxGIxtO6ZjyoqKkJ2dnamDb/fj+Li4kwbWVlZKCsrQ319feaUXmlpKdra2tC25/RZcXExHMdBU1MTACAvLw+FhYWIRCIAUvN0paWlqKury9yKUlZWhmg0ivb2dgBAIBCAUgpKKdTU1CA/Px/5+fmoq6tL/UB9PpSUlCASiWSWUAyHw2hubs5slRYMBtHZ2ZlZxq6goAB+vz9zi0FOTg5CoRBqa2szf2WGw2E0NTWho6Mj00YikUA0Gs38jHNyctDQ0JD5GQeDwUwb6Z9xY2Njpo1QKIR4PL5PG+k6KaXQ2NhofZ3Se8fuX6f0nKwJdXrzzTfh9/vx2Wef4atf/SrGjBmDSZMmZdpQSqG9vT3zeurs7EQ8Hs98nH49LV26FMuWLQOQul3F+Drl5iJw661Q99yD5qIi4IwzkL9uHfI7OlDn9wPLl8N3wgkHvJ7KysrQ1NRk1etp7zr19HrKz8/P1NaIOqHn19Oh/N5L/+60vU7dvZ4GDRoENzi6TjE0NjYqybuPNDY2it5dhfm8sWTJEhQVFeGmm27KfO7yyy/HaaedhgULFgAARo8ejQ0bNmDo0KHdtnP88cdjy5Yt2vvbb3//OzBiBPDOO8DEiUBdHbBsGXD//UAgkPr8fkytnVuYz3qu3Cqh7bR2+q8UqZjPbqbki0ajmXcj0WgUa9euxfjx4/d5zpw5c/D0009DKYW33noLwWDwoAMzYNG83vTpqceJE1OPpaXAddcBf/tbt4uRmFI7XZiPAI2ntYmoZ7t378YFF1wAIHWF9de+9jWcddZZeOSRRwAAV1xxBWbPno3Vq1ejvLwcBQUF+NWvfuVll92TTAI7dgB33HHg1xwHyMsb+D4RGULbae2Ojg6Vm5urpW0TdHR0gPnsJT3flClTsHnzZq+7cXB33AEsWQJ0dqYuAOsl6bVjPuuZfVrb2PssXcJ8dpOez4rT2kuWAKNHH9LADMivHfMRoHFwTl8JJxXz2U16vvQVs8baujX1uHbtIf9T6bVjPgJ4nzMReeGf/in1+IUveNsPIkNpG5wLCwt1NW0E5rOb9HxZh3iqeEB1dKSW7vzlL/v0z6XXjvkI0Dg4S995hPnsJj2f0btSXXNN6nHRoj79c+m1Yz4CNA7O6RVbpGI+u0nPl17pyUj//u/A6af3+Z9Lrx3zEcA5ZyIaSOvWpR5XrvS2H0SG0zY4C7+PjfksJz2fsae10yuClZb2uQnptWM+AjQOzsLXTmU+y0nPl97Ywyh7Nl7ASy/1qxnptWM+AjQOztI31GY+u0nPZ+RCD/Pnpx5nz+5XM9Jrx3wEaBycrVihqB+Yz27S8xnp5ZeBr3+9381Irx3zEaBxcDZ2zsslzGc36fmM8+tfpx4fe6zfTUmvHfMRoHHjCwD884jII5WVlaiqqvK6G59znNR/pi8rStR/Zm980djYqKtpIzCf3aTnM+o+508/TT12sz/zoZJeO+YjQOPgLH1Dbeazm/R8Rs3rpS8AmzrVleak1475COAiJESkk1LAO+8At93mdU+IrKJtcA6FQrqaNgLz2U16PmPuc/7JT1KPd93lWpPSa8d8BGgcnOPxuK6mjcB8dpOez5jT2rfcAgwfDrj4x4L02jEfARoHZ+kbajOf3aTnS5pwVfRf/5p63LDB1Wal1475COCcMxHpcsopqcdjj/W2H0QW0jY4S99Qm/nsJj1fVpbHf3cnEkAkAvz85643Lb12zEeAxsHZ5/PpatoIzGc36fk8X4XppptSj1df7XrT0mvHfARwEZI+Yz67Sc/n+SIkDzwATJuWWhXMZdJrx3wEcM6ZiNz25pupxxde8LYfRBbTNjhL31Cb+ewmPZ+np7XTF4INHqyleem1Yz4CNA7OgUBAV9NGYD67Sc/n2SIk6dtkVq7U9i2k1475CNA4OEvfUJv57CY9XyKR8OYbf+MbqccLL9T2LaTXjvkI4JwzEblp5UqtAzPR4ULb4Oz5rRyaMZ/dpOfzxHPPpR6fekrrt5FeO+YjAHA0rsFryOK+RIefyspKVFVVDew3Tf/SNWVdbyJvuPLXh7Z3zg0NDbqaNgLz2U16vgG/z7mmJvX4+99r/1bSa8d8BHBXqj5jPrtJzzfgu1Kdd17qMX0blUbSa8d8BPCCMCLqL6WAjRuBa6/1uidEYmgbnEtKSnQ1bQTms5v0fAN6n/MvfpF6/OlPB+TbSa8d8xGgcXCOxWK6mjYC89lNer4BPa39ne8ApaXAAG1oIL12zEeAxsG5tbVVV9NGYD67Sc+XTCYH5ht98EHq8Y03Bub7QX7tmI8AzjkTUX+ccUbqcexYb/tBJIy2wbmoqEhX00ZgPrtJz5eVNQB/dyeTwD/+Adx3n/7vtRfptWM+AjQOzp4tvD9AmM9u0vMNyCpMt9+eerz5Zv3fay/Sa8d8BGgcnKVvqM18dpOeb0AWIbn7bmDChM9XBhsg0mvHfARwzpmI+uLPf049vvKKt/0gEkrb4Oz3+3U1bQTms5v0fNpPa594YurxyCP1fp8uSK8d8xGgcXAuLi7W1bQRmM9u0vNpnddrb09dDLZsmb7vcRDSa8d8BGgcnKVvqM18dpOeL5FI6Gv88stTj5dcou97HIT02jEfAZxzJqJD9fTTwFlned0LItG0Dc4Dcp+lh5jPbibk+/jjj3H66adj7NixGDduHB544IEDnrNhwwYEg0FUVFSgoqICd955pwc93cvLL6ceV6zwrAsm1E4n5iMAcDSuwcsd14kOYufOndi5cycmT56M5uZmTJkyBc8//zzG7rXa1oYNG/CTn/wEL7744iG1XVlZiaqqKre7/PltUwO9JSWRPVy5GlPbnzD19fW6mjYC89nNhHxDhw7F5MmTAaQukjnuuONQXV3tStta7nNO/8xefdX9tg+pG97XTifmI0Dj4Kz1ghQDMJ/dTMv30UcfYcuWLZg2bdoBX9u4cSMmTZqEWbNmYdu2bb1qT8sZsYsuSj2eeab7bR8C02rnNuYjANC2x1tbWxtqamoAAIWFhfD5fJmVYXJzcxEIBDJX7TmOg3A4jIaGBsTjcQCpPT9jsVhmB5OioiJkZ2dn2vD7/SguLs60kZWVhbKyMtTX12eKX1paira2NrS1tQFIvTtxHAdNTU0AgLy8PBQWFiISiQBI3X5SWlqKurq6zDuPsrIyRKNRtLe3AwACgQCUUqirqwMA5OfnIz8/P/Oxz+dDSUkJIpFIZmegcDiM5ubmzFZpwWAQnZ2daGlpAQAUFBTA7/dn/qLMyclBKBRCbW1t5pdsOBxGU1MTOjo6Mm0kEglEo9HMzzgnJwcNDQ2Zn3EwGMy0kf4ZNzY2ZtoIhUKIx+P7tJGuU11dnYg6NTc3d1mnxsZGDBo0yIg6ZWdn47zzzsMdd9yR+XfpOn3hC1/A+++/D7/fj1WrVuHcc8/Fu+++2+XraenSpVi25/amSCTifp02bEDbt7+Ntj2v64GoU1evJ6UUmpqarHo97V2nnl5Pra2tmd+dtryeDuX3Xvrf2F6n7l5PgwYNghu0zTl3dnYqyWuodnZ2il4jlvkGRjwexznnnIOZM2fihhtu6PH5I0aMQFVVFcLh8EGf5/qc8xNPAIsWAbEYkJvrXrt9YErtdGE+65k955z+q00q5rObCfmUUli0aBGOO+64bgfmXbt2Zd5FbNq0CclkEmVlZT227fp+zosWAXl5ng/MgBm104n5CNB8Wlvy1mDMZzcT8v3hD3/AsmXLMGHCBFRUVAAA7r77bvzjH/8AAFxxxRVYuXIlHn74Yfh8PuTn52PFihW9WprT1cH5449Tjxs3utdmP5hQO52YjwCNgzMRHdzJJ5/c44Vb11xzDa655poB6lE3ZsxIPe75A4KI9OPa2n3EfHaTns+1OT2lgP/9X2DxYnfac4H02jEfARoH5wHZ7N1DzGc36flcc/fdqcfvf9/bfuxFeu2YjwCNg3P6sn2pmM9u0vO5tgjJ974HHHssYNCSi9Jrx3wEcOMLIurOX/6Sely/3tt+EB2GtA3OeXl5upo2AvPZTXo+VzYX+Kd/Sj0efXT/23KR9NoxHwEaB+fCwkJdTRuB+ewmPV+/B+eODqClBXjsMXc65CLptWM+AjQOzuml4aRiPrtJz9fv9Yuvuy71+M1v9r8zLpNeO+YjgHPORNSVRx4BTj318y0iiWhAaRucha+dynyWk56vX15/PfX47LPe9qMb0mvHfARo3PgCAHdjJ/JIvza+SL9b1ve7gUgysze+SG8LJhXz2U16vj7POe/ZEhC/+517nXGZ9NoxHwEaB2fXFkEwFPPZTXq+PrvkktTjOed424+DkF475iOAF4QR0d5eeAH42te87gXRYU/b4NybPWdtxnx2k57P5+vDhnMrVqQef/lLdzvjMum1Yz4CNA7O0WhUV9NGYD67Sc/Xp/2cFyxIPebnu9sZl0mvHfMRoHFwbm9v19W0EZjPbtLzHfLgvHNn6vGtt9zvjMuk1475COCcMxEBn18ANm2at/0gIgAaB+dAIKCraSMwn92k5zukhR6UAt5+G7jpJn0dcpH02jEfARoHZ42LmxiB+ewmPd8huf/+1OO993rbj16SXjvmI0Dj4NycXsxAKOazm/R8h3Qv6Q03AEceCViyrKL02jEfAZxzJjq8bd+eetywwdNuENG+tA3O+YbfjtFfzGc36fl6vZ/zl76Uehw1Sl9nXCa9dsxHAAfnPmM+u0nP16vBOZEAdu/+fM7ZEtJrx3wEcOOLPmM+u0nP16uNL267LfV47bV6O+My6bVjPgI450x0+PrpT4HKys+3iCQiY2gbnPu0tq9FmM9u0vM5PQ24GzemHl98UX9nXCa9dsxHAOBovOeMN7MReaSyshJVVVXdPyE9ePOeUyK3uXIqSts750gkoqtpIzCf3aTnO+icc2tr6vGZZwamMy6TXjvmI0Dj4NynXXEswnx2k57voBYtSj3OnettP/pIeu2YjwBeEEZ0+FmxAjj/fK97QUQHoW3OWSmlerwoxWJKqZ4vurEY89mt2znnVatSA3NzM1BUNPAdc4H02jGf9cyec5a+firz2U16vm7X1k6/Y7Z0YAbk1475CNA4OMdiMV1NG4H57CY9X5dnxGprU4+Wr6MtvXbMRwDnnIkOH1/5SuoxvZ42ERlL2+AcDAZ1NW0E5rOb9HzZ+2//qBTwxhvAVVd50yEXSa8d8xGgcXA+pP1kLcR8dpOe74DT2o8+mnq0bJOLrkivHfMRoHFwbmlp0dW0EZjPbtLzHXAv6ZVXAqEQkJPjTYdcJL12zEcA55yJ5Pvww9Tjm2962w8i6jVtg3NBQYGupo3AfHaTnm+f/Zy//OXU47hx3nTGZdJrx3wEaByc/X6/rqaNwHx2k54vs8hDMpl653z33d52yEXSa8d8BGgcnOvr63U1bQTms5v0fJmLbpYsST3edptnfXGb9NoxHwGccyaS7Qc/AMaO/XyLSCKygrbBOUfAVaEHw3x2k57PcRxgy5bUB2vWeNsZl0mvHfMRoHHjCwDcxZ3II5WVlaj6y1+Ajo7UAiRENFDM3viiNr2Or1DMZzfp+RLxeGpgfuopr7viOum1Yz4CNA7OGt+RG4H57CY9Hz79NPV46aXe9kMD6bVjPgJ4QRiR51555RWMHj0a5eXluPfeew/4eiwWw7x581BeXo5p06bho48+6rnRhgZgxgz3O0tEA0Lb4BwOh3U1bQR/N1/xAAAgAElEQVTms5sp+To7O3H11Vfj5ZdfxnvvvYfly5fjvffe2+c5jz/+OEpKSvD+++/j+uuvx6233nrwRteuhS+RAH7zG409944ptdOF+QjQODg3NTXpatoIzGc3U/Jt2rQJ5eXlGDlyJHJzczF//nysWrVqn+esWrUKCxcuBADMnTsX69evP+ipwfismejMykqtpS2QKbXThfkI0Hi19ujRo1V+fj6A1FKCjuNkFkZwHAfZ2dlIJBKZ5/t8PnR2dmZ+6WRnZ0MplVnAvy9t+Hw+JJPJTBvpbfTSbWRlZSErK+uANvb/uKs2du/ejXA4fEAbA5VNdxu1tbUYNGiQ9XXqro3a2locccQRntepsbERLS0tGDZsGIDUAg1tbW0YNmxYpo3t27ejvLw8k+mvf/0rxowZk1kFLN2P3bt3o7a2Fu2d7cjuzMKEiROtr1NX/YpEIgiHw1a9ng6ljfTvFtvr1N3P57PPPsv87rS5Tt218c4772xTSo1HfymltPw3adIkJRnz2c2UfM8884xatGhR5uOnn35aXX311fs8Z9y4cerjjz/OfDxy5EhVU1PTZXtl/zJTYQlUfn6+ng4bwJTa6cJ8dgNQpVwYQ7Wd1j5gs3dhmM9upuQbNmwYPv7448zHn3zySeZddFfPSSQSaGxsRFlZWZftRUJrUN78jc/X1hbIlNrpwnwE8FaqPmM+u5mSb+rUqdixYwc+/PBDdHR0YMWKFZgzZ84+z5kzZw6e2nO/8sqVK3HGGWd0Ofhe8dAyAMDmOx4xJp8OkrMBzEcpPl0NX3zxxbqaNgLz2c2UfD6fDw8++CBmzpyJzs5OXHbZZRg3bhy+//3vo7KyEnPmzMGiRYvw9a9/HeXl5SgtLcWKFSu6bOvRmkuBzhwECv3dvrOWwJTa6cJ81nvMjUa0XRBWU1OjBg0apKVtE9TU1ID57CUt35+3V+OEFcPxH6dsxsVnTEZFRQW2bt3qdbe0kFa7/TGf9cxevrOwsFBX00ZgPrtJy3fKozMBABefMRlA6upRqaTVbn/MRwB3peoz5rObpHzJpEIsuA0nJ7+X+ZzkC8Ik1a4rzEdAPwdnx3Euchxnm+M4ScdxKvf+2h133IHy8nKMHj0aa7rZsu7DDz/EtGnTUF5ejnnz5qGjo6M/3dFq3rx5qKioQEVFBUaMGIHjjz++y+eNGDECEyZMQEVFBSorK7t8jomWLFmCYcOGZTKuXLmyy+f1tNSkqW6++WaMGTMGEydOxAUXXIC///3vXT7Ppvqla1E0KAy8Abz+/TsyX+vs7Ozbsp+G+Pjjj3H66adj7NixGDduHB544IHM1xoaGgAAGzZsQDAYzByzd955p1fd7ZPujrV0PqUUrr32WpSXl2PixIl4++23verqIdu+fXumLhUVFQgEArj//vsB2Fu/yy67DIMHD8b48Z/fwlxXV4fp06dj1KhRmD59Ourr67v8t47jLHQcZ8ee/xb26hv25z4sAMcBGA1gA4DKvT4/duzYsaq9vV397W9/UyNHjlSJROKA+8EuuugitXz5cqWUUpdffrl66KGH3LjNTLsbbrhB3XLLLV1+7eijj+72HlSTLV68WP34xz/OfPzZZ58d8JxEIqFGjhypPvjgAxWLxdTEiRPVtm3bBrKbfbZmzRoVj8eVUkrdcsst6pprrunyebbUb+9a4HtQGJSzTy0mTZqkfvGLX6jLL79cKaXU8uXL1Ve/+lWvunvIPv30U7V582allFJNTU1q1KhRmXzpY/P1119XZ599tmd97K/ujrV0vpdeekmdddZZKplMqo0bN6oTTjhhoLvoikQioYYMGaI++ugjpZS99fvv//5vtXnzZjVu3LjM526++WZ1zz33KKWUuueee9Ljwv7jZCmAv+15LNnz/yX7P2////r1zlkp9Vel1PYuvnTe3Llz4ff7ccwxx6C8vBybNm064I+C1157DXPnzgUALFy4EM8//3x/ujMglFL47W9/i3nz5nndFa1yc3MP+Fxvlpo01YwZM+DzpW5OOPHEE7F7926Pe9Q/6Vr8ZVcb4AO+Of+6fWrhOM4hL/tpkqFDh2Ly5NT8eXFxMY477jhUV1cD6PrYlCSdb9WqVbj00kvhOA5OPPFENDQ0YOfOnR737tCtX78exx57LI4++mgA9tbv1FNPRWlp6T6f2/s1dpAxbCaAV5VSdUqpegCvAjirp++na8552KhRozIfDB8+PPPCSotEIgiFQplfmF09x0RvvPEGhgwZkvnFsT/HcTBjxgxMmTIFjz3myhX1A+bBBx/ExIkTcdlll2WWpdtbdXU1jjrqqMzHttRsf0888cQB9xKn2VK/dC0u+N0pAIBTp07cpxbZ2dn71Mvn8yEYDCISiXjS3/746KOPsGXLFkybNg0AEAwGM1/buHEjJk2ahFmzZmHbtm1edbFPujvW0vmkvN5WrFiBBQsWZD6WUj8gtYzz0KFDAQBHHHFEd3/0DwPw8V4ff7LncwfV433OjuOsA3BEF1/6N6VUt2+bmpube2raOGeeeSZ27dp1wOd/+MMf4rzzzgMALF++HAsWLEBtbW2Xu6u8+eabGDZsGD777DNMnz4dY8aMwamnnqq9771xsHxXXnklbr/9djiOg9tvvx1XX301/vM//9ODXvZdb+r3wx/+ED6fDzNnzuyyDZPrt79EZxIqrx7zix868Gt7rQtss5aWFlx44YW4//77EQgEACDz2ps8eTL+/ve/o6ioCKtXr8b555+PHTt2eNzj3uvuWOvud4uNOjo68MILL+Cee+7JfE5K/fbnOI6rF2L2ODgrpc7sQ7vVe/+F19WShGVlZWhoaEAikYDP5+vyOQNt3bp1B/16IpHAs88+i82bN3d7ejCdYfDgwbjggguwadMmY36595Qv7Vvf+hZmzZp1wOd7s9Skl3rK9+STT+LFF1/E+vXrEY1Gu3yOyfXb27Bhw/BfG9YB3wB+/S9X4L777u122c/hw4f3uOynieLxOC688EJcfPHF+MpXvpL5fPq1lx6sAWD27Nm46qqrrBrYujvW0vlMf731xssvv4zJkydjyJAhmc9JqR8ADBkyBDt37sTQoUOxc+dODB48uKunVQM4ba+PhyN1ndZB6Tqt/cLzzz+PWCyGDz/8EDt27MAJJ5ywzxMcx8Hpp5+euSr4qaeeyry7MdW6deswZswYDB8+vMu/kKLRaOaMQTQaxdq1a/e5ss9ke89lPffccxgzZswBz+nNUpOmeuWVV/CjH/0IL7zwAgoKCqyv39SpU9HS8DGKPqpEIhHv17KfJlJKYdGiRTjuuONwww037PO1dIZdu3ZlftFv2rQJyWTSmj8+DnaspfPNmTMHTz/9NJRSeOuttxAMBjOnUG2RPtO4Nwn1S9v7NXaQMWwNgBmO45Q4jlMCYMaezx1cT1eMHew/ABcgdf48BmA3gDXpr911111q5MiR6otf/KJavXp15uq2WbNmqerqaqWUUh988IGaOnWqOvbYY9XcuXNVe3t7P6+n02vhwoXq4Ycf3udz1dXVatasWUqpVJ6JEyeqiRMnqrFjx6q77rrLi272ySWXXKLGjx+vJkyYoM4991z16aefKqX2zadU6grSUaNGqZEjR1qV79hjj1XDhw9XkyZNUpMmTcpcxWxr/X626r8VvgZ19DEj96nF7bffrlatWqWmTJmi2tra1Ny5c9Wxxx6rpk6dqj744AOPe917b7zxhgKgJkyYkKnZSy+9pB5++OHMa/DnP/+5Gjt2rJo4caKaNm2a+sMf/uBxr3uvu2Nt73zJZFJdddVVauTIkWr8+PHqz3/+s5ddPmQtLS2qtLRUNTQ0ZD5nc/3mz5+vjjjiCOXz+dSwYcPUL3/5S1VbW6vOOOMMVV5err785S+rSCSiVGpsrATwS/X5WHkZgPf3/PfPqhfjq7blOxsbG9XeE//SNDY2gvnsZXs+547Uuw+1uOvX7/HHH48tW7YMZJcGjO216wnzWc/s5TtNXlDEDcxnN5vz7aprAQB895jubz3U9Ue3CWyuXW8wHwEaB2ci0mPyDy4FANx9qdnXaBBR32kbnEOhkK6mjcB8drM5387Qcxje+NWDPkfyhvY21643mI8AjYNzPB7X1bQRmM9utua78fFnAABbFv/qoM+TfFrb1tr1FvMRoHFw7u4+UimYz2625lv6SeodczhYcNDndbXCmxS21q63mI8AzjkTWePdD1NLAz56wh897gkR6aZtcJa+oTbz2c3GfCc+kFpk5NuzTurxuVlZcv/utrF2h4L5CNA4OKc3tJCK+exmW75kUiFasglTYjf0/GTAmpXA+sK22h0q5iNA4+Dc2Nioq2kjMJ/dbMs39yc/AwC8ueS+Xj2/s7NTZ3c8ZVvtDhXzEcA5ZyIrPNf2L3BaByMvl+86iA4H2gZnWzfU7i3ms5tN+V7dnNpG76W5v+/1v5F8Wtum2vUF8xEAfWtrK6WU5F8QSinRvwCZzxzZNw9Hsqi623W0u1JZWYmqqiqNvfKOTbXrC+azntlra9fW1upq2gjMZzdb8nXEO5EsqsY5uT85pH+XSCQ09ch7ttSur5iPAM45ExntlDv+FQCw6tbeXaVNRDJoG5yFn7ZgPsvZkm9Tzo+Q33A8srLs6O9AsKV2fcV8BGgcnMPhsK6mjcB8drMh3xNrNgEA3vrO6kP+t5LvJbWhdv3BfARoHJwbGhp0NW0E5rObDfkWvTUNADBx5BGH/G8l3+dsQ+36g/kI4K5UfcZ8djM9X11TGwDgO0OX9+nfc1cqezEfAbwgjMhIU+74FgDgZ9+e73FPiMgL2gbnkpISXU0bgfnsZnq+jwK/xuCGc/r877Ozs13sjVlMr11/MR8BGgfnWCymq2kjMJ/dTM63+NcvAgA2/+uv+9yG5NPaJtfODcxHgMbBubW1VVfTRmA+u5mc7873zwUADB8U6HMbyWTSre4Yx+TauYH5COCcM5FRPvi0DgDw04nrPe4JEXlJ2+BcVFSkq2kjMJ/dTM035UcXAgBuuOCMfrWTlSX3725Ta+cW5iNA4+As+YIUgPlsZ2I+pYDGkg0Y23pFv9uSvAqTibVzE/MRoHFwlr6hNvPZzcR8Cx/4JQDgT0se6HdbkhchMbF2bmI+AjjnTGSMZY3fAjqKUJTP/W6JDnfaBme/36+raSMwn91My/eHbX8HADxz1h9caU/yaW3Tauc25iMAcHTdD6mUUpJ/QUjfMJz5BlbujaMQD7wPtdid12NlZSWqqqpcacs0ptXObcxnPVfCaXvnLH1Dbeazm0n5Ep1JxAPv4wznTvfaTCRca8s0JtVOB+YjgHPORJ6bftcPAABr/u3fPO4JEZlC2+As+T5LgPlsZ1K+DViCnKYvwpdtTp9MZlLtdGA+AjQOzmVlZbqaNgLz2c2UfL/9/TsAgN9/81VX2/X5fK62ZxJTaqcL8xGgcXCur6/X1bQRmM9upuSbt+afAAAnHvcFV9uVfJ+zKbXThfkIALT9eS35ghSA+Wzndb6bb74Zq154AWhoxReOOB4N1zUgFAod8LwRI0aguLgY2dnZ8Pl8vb4CW/KuVF7XTjfmI0Dj4ExE3Zs+fTp+p+qB4v/D/NbpuOeee3Dfffd1+dzXX38d4XB4gHtIRF7Sdlq7tLRUV9NGYD67eZ1vxowZ2F78OEL1Z+DEE0/EJ5984mr7kuecva6dbsxHgMbBua2tTVfTRmA+u3md70f/tQ4A8PatK/HEE09g1qxZXT7PcRzMmDEDU6ZMwWOPPdbr9iXv5+x17XRjPgI0ntauq6vLFKGwsBA+ny+z4Hlubi4CgUDmZnTHcRAOh9HQ0IB4PA4AKCkpQSwWy2zMXVRUhOzs7Ewbfr8fxcXFmTaysrJQVlaG+vr6zJxGaWkp2traMv0oLi6G4zhoamoCAOTl5aGwsBCRSARAareU0tJS1NXVZS6oKSsrQzQaRXt7OwAgEAhAKYXq6mqUlpYiPz8f+fn5qKtL7cPr8/lQUlKCSCSS+QUZDofR3NyMWCwGAAgGg+js7ERLSwsAoKCgAH6/P3OhRE5ODkKhEGprazNzh+FwGE1NTejo6Mi0kUgkEI1GMz/jnJwcNDQ0ZH7GwWAw00b6Z9zY2JhpIxQKIR6P79NGuk51dXU44ogjrK9Tc3MzABxQp8bGRpSXl2ut04UXXohIJAKlVObrjuPgBz/4AX787hUII4wnHloKn8+HmTNnoqam5oA6rVq1Cscddxyqq6tx9tln44gjjsCZZ57Z5etp6dKlWLZsGQAgEomIqFNXryelFJLJpFWvp73r1NPrKRKJZH7GNtepu9dT+nen7XXq7vU0aNAguEHb8p01NTXKrU6aqKamxrUimIj59PmkpglHPRTE+Tv/BbveeQvr169HQUFBj/9uyZIlKCoqwk033dTjcysqKrB161Y3umscHpt2k54Ppi/fWVxcrKtpIzCf3bzMN/nuBcAOYPvv1+CFF17odmCORqOZdyrRaBRr167F+PHje/U9JO+Zy2PTbtLzuUXb4Cx8YXPms5yX+WpCq+F7qQjNzc2YPn06KioqcMUVVwAAPv30U8yePRsAsHv3bpx88smYNGkSTjjhBJx99tk466yzPOu3KXhs2k16Prdom3NuamoSfeqC+ezmVb6rH/lPAEDNxzUIFeUd8PUjjzwSq1evBgCMHDkS77zzTp++j+RFSHhs2k16PrdwkVOiAfTQ7ouBZFaXAzMRUZq2wTkvT/YvH+azmxf53t7xKQDgyZPf0v69JG8uwGPTbtLzuUXbK7iwsFBX00ZgPrt5ke//PZy6l3nh9Knav5fkwZnHpt2k53OLtldw+h46qZjPbgOdL5lUaA/+D05M3DYg30/y+sU8Nu0mPZ9b5P55TWSQc+/9CQDgv79/l8c9ISIbaBucJd9nCTCf7QY63+r4LchuGY7cHNk/14HAY9Nu0vO5hRtf9BHz2W0g8734p78CANZc/PqAfU9ufGEv5iNA4+CcXnNVKuaz20Dmm/PcqQCAL1eUD9j3lDznzGPTbtLzuUXb4Cx5EQSA+Ww3UPnaOxJQ+bW4qPDnA/L9Dgc8Nu0mPZ9beEEYkUYnLb4ZALDihqs97gkR2UTb4FxWVqaraSMwn90GKt/WvPtR1HAisrIGdj1hyXPOPDbtJj2fW7QNzum9MqViPrsNRL6HXnoTAPDWdau0f6/9pffUlYjHpt2k53OLtsE5vUm3VMxnt4HId3XVKQCAcSMGa/9e+5M8OPPYtJv0fG7hnDORBp/Vp94d3HTUSo97QkQ20jY4BwIBXU0bgfnspjvf5B98AwDw48su1Pp9uiN5oQcem3aTns8t2gZnpZSupo3AfHbTna86uBJHNn5F6/c4XPHYtJv0fG7RNjg3NzfratoIzGc3nflu/dVzAIAttz+t7Xv0RPK9pDw27SY9n1s450zksh/9I/WOeXAJt8Yjor7RNjjn5+fratoIzGc3Xfn++o8aAMAvpryhpf3ekryfM49Nu0nP5xYOzn3EfHbTle+EpecBAK4652Qt7fcWB2d7MR8B3Piiz5jPbjryJZMKLSUbMan9WtfbPlTc+MJezEcA55yJXDN/6S8AAG/d8VOPe0JEttM2OEte2xdgPtvpyPdM9Dtw2kqRl+v9z85xBnYt74HEY9Nu0vO5RdvgXFJSoqtpIzCf3dzO99rWDwAAq8739kKwNMmLkPDYtJv0fG7RNjhHIhFdTRuB+ezmdr4Zvz4DAHDuiWNdbbevJM8589i0m/R8btE2OEteeB9gPtu5mS+eSKKz6B+YlXOva21S93hs2k16PrfwgjCifjrtjtsBAC/edovHPSEiKbQNzuFwWFfTRmA+u7mZ74++u5HXOAFZWeZchCX5ohsem3aTns8tXFu7j5jPbm7le3pdFQDgzStfdqU9t3BtbXsxHwEaB+dYLKaraSMwn93cyrfwjWkAgCmjhrnSnlsk7/zDY9Nu0vO5hXPORH3U0NIOZCVxxeBlXneFiITRNjgHg0FdTRuB+ezmRr4pSy4HADx85SX9bsttku9z5rFpN+n53KJtcJY85wUwn+3cyPe34qcRbjjLhd64T/JpbR6bdpOezy3aBueWlhZdTRuB+ezW33x3Lk9dALb5uyvc6I7rJN9LymPTbtLzuYVzzkR9sPj/ZgMAvjCYp+iIyH3aBueCggJdTRuB+ezWn3wf7qwHANw37lW3uuM6yfs589i0m/R8btH2Cvb7/bqaNgLz2a0/+abcdxEA4Ja5Z7rVHddJ3pWKx6bdpOdzi7bBub6+XlfTRmA+u/UnX33JenwxusjF3rhP8kU3PDbtJj2fW+Se+yLS4LKf/woAsPmOhzzuCRFJpm1wzsnJ0dW0EZjPbn3N96u6y4B4Horyc13ukbskn9bmsWk36fncom1wDoVCupo2AvPZrS/5/vTXjwEAK6ZvdLs7rpO8CAmPTbtJz+cWbYNzbW2trqaNwHx260u+U/99BgBg3pcq3O6O6xKJhNdd0IbHpt2k53OLtsFZ8gpFAPPZ7lDzJZMKHcH/xanq+5p6RL3FY9Nu0vO5hReEEfXCjLvuBgCsv32xxz0hosOBtsFZ+obazGe3Q823Xn0PvuZj4cu24+9Zn8/ndRe04bFpN+n53KLtN01TU5Oupo3AfHY7lHz/9eZfAACvf2Odq31YsmQJhg0bhoqKClRUVGD16tVdPu+VV17B6NGjUV5ejnvvvbdXbUu+z5nHpt2k53OLtj+vOzo6dDVtBOaz26Hkm7v6/wF+4OTxI1zvx/XXX4+bbrqp2693dnbi6quvxquvvorhw4dj6tSpmDNnDsaOHXvQdiXP6/HYtJv0fG6x4xwdkUei7R2AvxmXBB/15Ptv2rQJ5eXlGDlyJHJzczF//nysWrXKk74Q0cDRNjhL31Cb+ezW23wnLL4OAPDUtd/S0o8HH3wQEydOxGWXXdblsobV1dU46qijMh8PHz4c1dXVPbYr+T5nHpt2k57PLdpOazc1NWVOrRUWFsLn86GxsREAkJubi0AgkLnfzXEchMNhNDQ0IB6PAwBKSkoQi8XQ2toKACgqKkJ2dnamDb/fj+Li4kwbWVlZKCsrQ319feYez9LSUrS1taGtrQ0AUFxcDMdxMnMeeXl5KCwsRCQSAZD6hVZaWoq6urrMnF1ZWRmi0Sja29sBAIFAAEop1NTUIC8vD/n5+cjPz0ddXV3qB+rzoaSkBJFIJLOnbjgcRnNzM2KxGIDUwdnZ2ZnZ17SgoAB+vz/zyzknJwehUAi1tbWZn2E4HEZTU1PmlFAwGEQikUA0Gs38jHNyctDQ0JD5GQeDwUwb6Z9xY2Njpo1QKIR4PL5PG+k6tbe3IxAIWF+n5uZmADigTvF4HEceeWSPdfpbwZM4puksRCK1farTvHnzsGvXrszXHceB4zi49dZbcdFFF+Haa69FKBTCjTfeiKuvvho/+9nP9qlTU1MTkskkWltbEY1G0dTUhEQigY6OjgNeT0uXLsWyZcsAAHV1dSLq1NXrqaCgAO3t7Va9nvauU0+vp/Tzba9Td7/3amtrkZeXZ32duns9DRo0CG5wdM1N1dTUKLc6aaKamhrXimAi5gOWPvc6bvyfM/B/i2oxaniZ1v589NFHOOecc/Duu+/u8/mNGzdiyZIlWLNmDQDgnnvuAQB897vfPWh7FRUV2Lp1q57OeozHpt2k5wPgytq5nHMm6saN/3MGAGgbmHfu3Jn5/+eeew7jx48/4DlTp07Fjh078OGHH6KjowMrVqzAnDlztPSHiMyh7bR2YWGhrqaNwHx26ynfp5HU6bvbj31BWx9uueUWbN26FY7jYMSIEXj00dRFZ59++im++c1vYvXq1fD5fHjwwQcxc+ZMdHZ24rLLLsO4ceN6bDsrS+7f3Yf7sWk76fncou20djweV5J3H4nH46J3Vznc8x1x/RzsDv0OarGdtyRNmTIFmzdv9robWhzux6btpOeD6ae10xP0UjGf3XrKtzv0OxzdtGCAeuM+yYuQHO7Hpu2k53OL3HNfRH103WO/AQC8vfhxj3tCRIcrbYNzbq7Zm9H3F/PZ7WD5frZzPgCgNJA/UN1xneO4cmbNSIfzsSmB9Hxu4SIkfcR8dusu3zsf7AIA/PLEtwayO67jIiT2Yj4CNA7O0jfUZj67dZfvpAfPBgAsmjltILvjuvSCFBIdrsemFNLzuUXb4Cx54X2A+WzXVb5kUqEt9DamdnS/EQV573A8NiWRns8t2gZnyXNeAPPZrKG9AZe/eDkeqXoETbHPt6+74Ef3AwDeXNK7bRnJG5KPTYD5KEXbfc4A+OcRGSnaEUXJfSXIzkrNy84ZPQfXnnAtTv7VychqPQKd9+3soQXzVVZWoqqqyutuEB2OzL7Pee/F2yViPnsV5hZi9lGz0Z5oR3uiHc9sewbTn54JAPjqxPPwWfQzj3vYf5Lvc5Z8bALMRynaBmfpG2ozn93mjp6L4txiAICCQltnaoeaVR89jS/8f1/AWf9xFl55/xV0Ju0c5CTP60k/NpmPAC5CQoepU48+FR2dB/6SaEu0IdYZw5oP1uDc5efipMdP8qB3RHS40zY4h0IhXU0bgfnsNnTQUJxxzBndfr0wpxDDiofhe6d8bwB75R7J9zlLPzaZjwCNg3N6U2qpmM9u8Xgc/1zxz5lT22mFOYUYXDgYD539ED649gPMGWPn9oyST2sfDsemZNLzuUXb4ByNRnU1bQTms1s0GsXsUbMRS6RObef7ChD0B3H3l+/Gx9d/jEsnXZq5mttGyWTS6y5oczgcm5JJz+cWbfs5E5muMLcQHX+dAYxch389/bu4/sTrUZjLvWaJyHvaBmfpG2ozn90KCwvR2grgN8/iqV+34dJTi3v8NzbJypJ7refhcGxKJj2fW7QNzj6f7DflzGc3n8+HSy8FkPTh0vmyBmZA9ipMh8OxKZn0fG7hIiR9xHx2a2xsxG9+A51/2YAAAAy1SURBVJx/vtc90YOLkNiL+Qjgfc50mHrttdTjsmXe9oOIqCvaBmfpG2ozn92+/e1UvqIijzuiieTT2tKPTeYjQOPgHAgEdDVtBOazV20t0NQUwIYNXvdEH8mLkEg+NgHmoxRtg7P0DbWZz14XXACEw7X40pe87ok+iUTC6y5oI/nYBJiPUjjnTIcVpYA33wS+9jWve0JE1D1tg7PkOS+A+Wz16KOpx+9+V2a+w4HUYzON+QgAHI1r8Mpd3Jes5ThAMAg0NHjdE70qKytRVVXldTeIDkeu/PWh7Z1zg/Dffsxnnw8/TD3+4Q8y8+1N8n3O0mvHfARwV6o+Yz77fPnLqcdx42Tm2xt3pbIX8xHAC8LoMJFMpt4533231z0hIuqZtsG5pKREV9NGYD67LF6cerztttSjtHz7k3yfs/TaMR8BGgfnWCymq2kjMJ9d7roLGDs2dUEYIC/f/iSf1pZeO+YjQOPg3NraqqtpIzCfPd5+O/W4Zs3nn5OUryvJZNLrLmgjvXbMRwDnnOkwcNJJqcfhw73tBxFRb2kbnIuk7iiwB/PZIRYDOjqAJ5/c9/NS8nUnK0vu393Sa8d8BGgcnCVfkAIwny2uvDL1uHDhvp+Xkq87kldhkl475iNA4+AsfUNt5rPDr34FzJhx4Oel5OuO5EVIpNeO+QjgnDMJtnZt6vE3v/G2H0REh0rb4Oz3+3U1bQTmM9/MmanHUOjAr0nIdzCST2tLrx3zEaBxcC4uLtbVtBGYz2zp5Xv3vn1qb7bn64nkeT3ptWM+AjQOztI31GY+s82bl3rsar4ZsD9fTxKJhNdd0EZ67ZiPAM45k1Br1wL//M9e94KIqG+0Dc6S77MEmM9kTz+denz44e6fY3O+w5302jEfAYCjcQ1euYv7ktEcB8jJSS0+criqrKxEVVWV190gOhy5cjWmtj9h6uvrdTVtBOYz0yefpB7feuvgz7M1X29Jvs9Zeu2YjwCNg7PkC1IA5jPVWWelHidPPvjzbM3XW5J3pZJeO+YjgBeEkSBKAdu2Ad/7ntc9ISLqH22Dc2lpqa6mjcB85rnvvtTjHXf0/Fwb8x0Kn8/ndRe0kV475iMA0PYKbmtrE737CPN5R6nURV/7++53gREjgN5cDOp1vnnz5mH79u0AgIaGBoRCIWzduvWA540YMQLFxcXIzs6Gz+fr9UVekvdz9rp2ujEfARyc+4z5vDN1KuDzAddfD5x/PuD3A+++m/raa6/1rg2v8/1mrwW/b7zxRgSDwW6f+/rrryMcDh9S+xyc7cV8BHDOmSw0ZAjwpz8B3/oWEA6ntoWcMCH1tWOO8bZvh0ophd/+9rdYsGCB110hIoNoe+ecnZ2NmpoaAEBhYSF8Pl9mq7Dc3FwEAoHMMm6O4yAcDqOhoQHxeBwAUFJSglgshtbWVgCpDbqzs7Mzbfj9fhQXF2fayMrKQllZGerr6zNXA5aWlqKtrQ1tbW0AUmu6Oo6DpqYmAEBeXh4KCwsRiUQyfS4tLUVdXV3mVpSysjJEo1G0t7cDAAKBAJRSiMViqKmpQX5+PvLz81FXV5f6gfp8KCkpQSQSybx7CYfDaG5uRiwWAwAEg0F0dnaipaUFAFBQUAC/35+5xSAnJwehUAi1tbWZq27D4TCamprQsefm3WAwiEQigWg0mvkZ5+TkoGHPotK5ubkIBoOZNtI/48bGxkwboVAI8Xh8nzbSdYrFYmhsbDSyThdfnI033iiFz1eH7OxOPPcckJVVhsLCKB56qB2zZwNDh6bq1NzcDAAH1CldX6/r9Oc//xlDhgxBSUkJampqDqiTUgrTp08HAFxyySW49NJLu309LV26FMuWLQMA1NXVeV6nQ3k9dVenrl5PRUVFaGpqsur1tHedeno9ZWVlZX532lyn7l5P6d+dttepu9fToEGD4AZti5DEYjElefeRWCwmencVk/O1tgJlZcCe3xv7KCwEOjtTp7u/8x3gpJO6np8eiHxnnnkmdu3adcDnf/jDH+K8884DAFx55ZUoLy/HjTfe2GUb1dXVGDZsGD777DNMnz4dP//5z3Hqqaf2+L2nTJmCzZs39y+AoUw+Nt3AfNZzZRESbYNzTU2NcusvCBPV1NS49heSiUzPd/bZwOrV3X/dcVIXjtXWpgby/ZmQL5FIYNiwYdi8eTOGDx/e4/OXLFmCoqIi3HTTTT0+t6KiossLzCQwoXY6MZ/1zF4hjEinyy4Dutt5rrAQmDIF+OMfux6YTbFu3TqMGTOm24E5Go1mTiNGo1GsXbsW48ePH8guEpFHtA3OeXl5upo2AvN5a9YsYM/0T0ZhITB6NPDss8CmTalT2t0xId+KFSsOuBDs008/xezZswEAu3fvxsknn4xJkybhhBNOwNlnn42z0kug9UDy5gIm1E4n5iNA42ntZDKpJP+CSCaTon8B2pAvfWq7sBAoLQWWLgUuvLDrOeb92ZCvPyRvfCG9dsxnPbNPa6evBJSK+bx3/fXAyJHAAw8Af/sbMHdu7wZmwI58/SF5/WLptWM+AjTeSkWk25lnAh984HUviIjcp+2dc3Z2tq6mjcB8dpOeTzLptWM+AjTOOQOQu2cdkeEkzzkTGc7sOef0yjFSMZ/dpOeTPOcsvXbMR4DGwTm9DJxUzGc36fkkk1475iOAi5AQEREZh/c595H0e/WYz26S55yl1475rGf2nHN6xw+pmM9u0vNJ3s9Zeu2YjwCNg3N7V1sGCcJ8dpOeT/LgLL12zEcA55yJiIiMo21wDgQCupo2AvPZTXo+yQs9SK8d8xGgcXDWuLiJEZjPbtLzSSa9dsxHgMbBOb0PrVTMZzfp+STfSyq9dsxHAOeciYiIjKNtcM7Pz9fVtBGYz27S80m+j1R67ZiPAA7OfcZ8dpOej4OzvZiPAG580WfMZzfp+bjxhb2YjwDOORMRERlH2+Ds8/l0NW0E5rOb9HyO48ryvkaSXjvmI0DjxhcAeDMbkUckb3xBZDizN76IRCK6mjYC89lNej7Jc87Sa8d8BGgcnCUvvA8wn+2k55NMeu2YjwBeEEZERGQcbXPOSikl+aIUpZToi26Yz26S55yl1475rGf2nLP09VOZz27S83FtbXsxHwEaB+dYLKaraSMwn92k55O884/02jEfAZxzJiIiMo62wTkYDOpq2gjMZzfp+bKzs73ugjbSa8d8BGgcnCXPeQHMZzvp+SSf1pZeO+YjQOPg3NLSoqtpIzCf3aTnk3wvqfTaMR8BnHMmIiIyjrbBuaCgQFfTRmA+u0nPJ3k/Z+m1Yz4CNA7Ofr9fV9NGYD67Sc8neZEH6bVjPgI0Ds719fW6mjYC89lNej7JF91Irx3zEcA5ZyIiIuNoG5xzcnJ0NW0E5rOb9HyST2tLrx3zEaBx4wsAcm+0JDKc5I0viAxn9sYXtbW1upo2AvPZTXq+RCLhdRe0kV475iNA4+AseYUigPlsJz2fZNJrx3wE8IIwIiIi42ibc1ZKKckXpUjfMJz57CZ5zll67ZjPembPOTc1Nelq2gjMZzfp+STf5yy9dsxHgMbBuaOjQ1fTRmA+u0nPJ3leT3rtmI8AzjkTEREZR9vgLH1Dbeaz20Dle+aZZzBu3DhkZWUdMAd8zz33oLy8HKNHj8aaNWu6/Pcffvghpk2bhvLycsybN6/X7zqys7P73XdT8di0m/R8btE2OEu+zxJgPtsNVL7x48fj2WefxamnnrrP59977z2sWLEC27ZtwyuvvIKrrrqqy3niW2+9Fddffz3ef/99lJSU4PHHH+/V95V8WpvHpt2k53OLtsE5Go3qatoIzGe3gcp33HHHYfTo0Qd8ftWqVZg/fz78fj+OOeYYlJeXY9OmTfs8RymF1157DXPnzgUALFy4EM8//3yvvm8ymex/5w3FY9Nu0vO5hXPORB6orq7GUUcdlfl4+PDhqK6u3uc5kUgEoVAIPp+v2+cQkUw619YmOiw4jrMOwBFdfOnflFKr9jxnA4CblFJVez5+EMBbSqn/2PPx4wBeVkqt3Kvd8J7nlO/5+Kg9zxnfTT++DeDbez7M6+55RGQ+n9cdILKdUurMPvyzagBH7fXx8D2f21sEQMhxHJ9SKtHNc/bux2MAHutDX4jIMDytTeSNFwDMdxzH7zjOMQBGAdhn0lmlTmu9DmDunk8tBLBqQHtJRJ7g4EykkeM4FziO8wmAkwC85DjOGgBQSm0D8FsA7wF4BcDVSqnOPf9mteM4R+5p4lYANziO8z6AMgC9u1ybiKzGOWciIiLD8J0zERGRYTg4ExERGYaDMxERkWE4OBMRERmGgzMREZFhODgTEREZhoMzERGRYTg4ExERGeb/B2Z5646+Jrx/AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 576x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 线性相关 线性无关的几何表达。\n",
    "###  \n",
    "import numpy as np \n",
    "import matplotlib.pyplot as plt\n",
    "#二维空间，线性相关的向量 \n",
    "u=np.array([2,5])\n",
    "v=-1.5*u # v为u的线性表达\n",
    "w=0.75*v\n",
    "fig3,axes3=plt.subplots()\n",
    "fig3.set_size_inches(8,8)\n",
    "axes3.set_xlim(-10,10)\n",
    "axes3.set_ylim(-10,10)\n",
    " \n",
    "axes3.spines['top'].set_visible(False)\n",
    "axes3.spines['right'].set_visible(False)\n",
    "axes3.spines['left'].set_position(('data',0))\n",
    "axes3.spines['bottom'].set_position(('data',0))\n",
    "# 为图像添加网格\n",
    "axes3.grid(color='gray',linestyle='--',alpha=0.2)\n",
    " \n",
    "\n",
    "axes3.arrow(0,0,v[0],v[1],head_length=0.3,head_width=0.5,color='blue',shape='full')\n",
    "axes3.arrow(0,0,u[0],u[1],head_length=0.3,head_width=0.5,color='red',shape='full')\n",
    "axes3.arrow(0,0,w[0],w[1],head_length=0.3,head_width=0.5,color='green',shape='full')\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "14b2a82a-0a0d-4f45-a6bd-ddcc6c121091",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "e4aae7d0-cf57-4b7c-8824-23e3334306d5",
   "metadata": {},
   "source": [
    "# 矩阵\n",
    "\n",
    "## Introduction to Matrices\n",
    "In general terms, a matrix is an array of numbers that are arranged into rows and columns.\n",
    "\n",
    "## Matrices and Matrix Notation\n",
    "A matrix arranges numbers into rows and columns, like this:\n",
    "\n",
    "\\begin{equation}A = \\begin{bmatrix}\n",
    "  1 & 2 & 3 \\\\\n",
    "  4 & 5 & 6\n",
    " \\end{bmatrix}\n",
    "\\end{equation}\n",
    "\n",
    "Note that matrices are generally named as a capital letter. We refer to the *elements* of the matrix using the lower case equivalent with a subscript row and column indicator, like this:\n",
    "\n",
    "\\begin{equation}A = \\begin{bmatrix}\n",
    "  a_{1,1} & a_{1,2} & a_{1,3} \\\\\n",
    "  a_{2,1} & a_{2,2} & a_{2,3}\n",
    " \\end{bmatrix}\n",
    "\\end{equation}\n",
    "\n",
    "In Python, you can define a matrix as a 2-dimensional *numpy.**array***, like this:\n",
    "python 中可以用两种方式表示矩阵， \n",
    "\n",
    "```pyhton \n",
    "m=np.matrix([[]])\n",
    "m=np.array([[]])\n",
    "```\n",
    " \n",
    "但一般用 np.array([[]])代替矩阵进行运算，因为这不但可以表示二维数组，还能表示多维度数组。\n",
    "\n",
    "\n",
    "可以将矩阵视为m个堆放在一起的n维向量，也可以将向量视为一个特殊矩阵。\n",
    "> 张量、阶的概念\n",
    "在某些情况下，将会讨论超过两维的数组。一般的，一个数组中的元素分布在若干维坐标的规则网格中，我们称之为张量\n",
    "\n",
    "在深度学习中，向量化是一个非常重要的概念，例如pytorch，tensorflow的基础数据表达都是向量，但其表达上与Numpy有一定的差别，但概念内涵一致。\n",
    "相关概念包括：\n",
    " \n",
    "\n",
    "* 秩（Rank）：张量轴数。标量的秩为 0，向量的秩为 1，矩阵的秩为 2。\n",
    "* 形状（Shape）：张量的每个轴的长度（元素数量）。\n",
    "* 轴或维度（Axis，Dimension）：张量的一个特殊维度。\n",
    "* 大小（Size）：张量的总项数，即乘积形状向量\n",
    "\n",
    "| 线性代数中概念 | 深度学习中一般表达| Numpy例子|Tensorflow例子|pytorch例子|轴（阶、秩）的数目|\n",
    "| -------- | -------- | -------- | -------- | -------- |-------- |\n",
    "| 标量(Scale)  | “0 秩”张量(\"rank-0\" tensor)   | numpy.array(5)   |tf.constant(5)|troch.tensor(5)|0|\n",
    "| 向量(Vector)  | “1 秩”张量(\"rank-1\" tensor)   | numpy.array([5,1,1])   |tf.constant([5,1,1,1])|troch.tensor([5,1,1,1])|1|\n",
    "| 矩阵(Matrix)  | “2 秩”张量(\"rank-2\" tensor)   | numpy.array([[5,1,1]])   |tf.constant([[5,1,1,1]])|troch.tensor([[5,1,1,1]])|2|\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "b47e9b56-02e7-4886-b48a-141e42f7e847",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-22T10:22:47.480143Z",
     "iopub.status.busy": "2022-03-22T10:22:47.479554Z",
     "iopub.status.idle": "2022-03-22T10:22:47.487330Z",
     "shell.execute_reply": "2022-03-22T10:22:47.486507Z",
     "shell.execute_reply.started": "2022-03-22T10:22:47.480103Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "矩阵元素个数： 9\n",
      "矩阵的轴数： 2\n",
      "矩阵的形状： (3, 3)\n"
     ]
    }
   ],
   "source": [
    " # 定义一个矩阵\n",
    " import numpy as np \n",
    " m=np.matrix([[1,2,3],[4,5,6],[7,8,9]])\n",
    " print(\"矩阵元素个数：\",m.size)\n",
    " print(\"矩阵的轴数：\",m.ndim)\n",
    " print(\"矩阵的形状：\",m.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "78502b29-2588-40f0-ba48-2bf758588903",
   "metadata": {},
   "source": [
    "### 特殊矩阵\n",
    "1. Identity Matrices 单位矩阵\n",
    "\n",
    "An *identity* matrix (usually indicated by a capital **I**) is the equivalent in matrix terms of the number **1**. It always has the same number of rows as columns, and it has the value **1** in the diagonal element positions I<sub>1,1</sub>, I<sub>2,2</sub>, etc; and 0 in all other element positions. Here's an example of a 3x3 identity matrix:\n",
    "\n",
    "\\begin{equation}\\begin{bmatrix}1 & 0 & 0\\\\0 & 1 & 0\\\\0 & 0 & 1\\end{bmatrix} \\end{equation}\n",
    "\n",
    "Multiplying any matrix by an identity matrix is the same as multiplying a number by 1; the result is the same as the original value:\n",
    "\n",
    "\\begin{equation}\\begin{bmatrix}1 & 2 & 3 \\\\4 & 5 & 6\\\\7 & 8 & 9\\end{bmatrix} \\cdot \\begin{bmatrix}1 & 0 & 0\\\\0 & 1 & 0\\\\0 & 0 & 1\\end{bmatrix} = \\begin{bmatrix}1 & 2 & 3 \\\\4 & 5 & 6\\\\7 & 8 & 9\\end{bmatrix} \\end{equation}\n",
    "\n",
    "单位矩阵定义为主对角线元素为1，其他元素为0的**方阵**。单位矩阵以符号$I$或$I_n$表示，下标$n$表示其行列数。\n",
    "\n",
    "单位矩阵很重要，因为其与标量代数中的1起到类似的作用。\n",
    "\n",
    "同时单位矩阵不论自乘多少次任保持不变\n",
    "$$(I_n)^k=I_n \\quad (k=1,2,...)$$\n",
    "\n",
    "具有这种性质($AA=A$)的矩阵称为**幂等矩阵** \n",
    " \n",
    "2. 0 矩阵\n",
    "\n",
    "零矩阵是一个所有元素均为0的简单矩阵，但是其不一定是方阵，其起到作用与标量0的作用相似，例如。\n",
    "$$ 0_{(2 \\times 2)}= \\begin{bmatrix} 0&0\\\\0&0 \\end{bmatrix}$$\n",
    "$$ 0_{(2 \\times 3)}= \\begin{bmatrix} 0&0&0\\\\0&0&0 \\end{bmatrix}$$\n",
    "\n",
    "3. 对称矩阵\n",
    "\n",
    "矩阵$C_m \\times n$中若$c_ij=c_ji$，称为对称矩阵，也即元素关于主对角线对称。\n",
    "\n",
    "\n",
    "---\n",
    " \n",
    "Numpy 中相关特殊矩阵的创建：\n",
    " ```python \n",
    " zero=np.zeros((2,3))# 创建2r3c的0矩阵\n",
    " one=np.eye(3)#创建单位矩阵\n",
    " one=np.identity(3)#创建单位矩阵\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9f208247-fd54-4db0-a273-9ea120753054",
   "metadata": {},
   "source": [
    "## Matrix Operations\n",
    "Matrices support common arithmetic operations.\n",
    "\n",
    "### Adding Matrices\n",
    "To add two matrices of the same size together, just add the corresponding elements in each matrix:\n",
    "\n",
    "\\begin{equation}\\begin{bmatrix}1 & 2 & 3 \\\\4 & 5 & 6\\end{bmatrix}+ \\begin{bmatrix}6 & 5 & 4 \\\\3 & 2 & 1\\end{bmatrix} = \\begin{bmatrix}7 & 7 & 7 \\\\7 & 7 & 7\\end{bmatrix}\\end{equation}\n",
    "\n",
    "In this example, we're adding two matrices (let's call them ***A*** and ***B***). Each matrix has two rows of three columns (so we describe them as 2x3 matrices). Adding these will create a new matrix of the same dimensions with the values a<sub>1,1</sub> + b<sub>1,1</sub>, a<sub>1,2</sub> + b<sub>1,2</sub>, a<sub>1,3</sub> + b<sub>1,3</sub>,a<sub>2,1</sub> + b<sub>2,1</sub>, a<sub>2,2</sub> + b<sub>2,2</sub>, and a<sub>2,3</sub> + b<sub>2,3</sub>. In this instance, each pair of corresponding elements(1 and 6, 2, and 5, 3 and 4, etc.) adds up to 7.\n",
    "\n",
    " ---\n",
    " ## Subtracting Matrices\n",
    "Matrix subtraction works similarly to matrix addition:\n",
    "\n",
    "\\begin{equation}\\begin{bmatrix}1 & 2 & 3 \\\\4 & 5 & 6\\end{bmatrix}- \\begin{bmatrix}6 & 5 & 4 \\\\3 & 2 & 1\\end{bmatrix} = \\begin{bmatrix}-5 & -3 & -1 \\\\1 & 3 & 5\\end{bmatrix}\\end{equation}\n",
    "\n",
    "---\n",
    "### Negative Matrices\n",
    "The nagative of a matrix, is just a matrix with the sign of each element reversed:\n",
    "\n",
    "\\begin{equation}C = \\begin{bmatrix}-5 & -3 & -1 \\\\1 & 3 & 5\\end{bmatrix}\\end{equation}\n",
    "\n",
    "\\begin{equation}-C = \\begin{bmatrix}5 & 3 & 1 \\\\-1 & -3 & -5\\end{bmatrix}\\end{equation}\n",
    "\n",
    "---\n",
    "#### Conformability（矩阵一致性）\n",
    "In the previous examples, we were able to add and subtract the matrices, because the *operands* (the matrices we are operating on) are ***conformable*** for the specific operation (in this case, addition or subtraction). To be conformable for addition and subtraction, the operands must have the same number of rows and columns. There are different conformability requirements for other operations, such as multiplication; which we'll explore later."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e39a9786-81ea-40d2-9fe5-506322d8197c",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "e3ee88da-7c19-4836-818b-6553f6251a4e",
   "metadata": {},
   "source": [
    "### Matrix Transposition（矩阵转置）\n",
    "You can *transpose* a matrix, that is switch the orientation of its rows and columns. You indicate this with a superscript **T**, like this:\n",
    "\n",
    "\\begin{equation}\\begin{bmatrix}1 & 2 & 3 \\\\4 & 5 & 6\\end{bmatrix}^{T} = \\begin{bmatrix}1 & 4\\\\2 & 5\\\\3 & 6 \\end{bmatrix}\\end{equation}\n",
    "\n",
    "In Python, both *numpy.**array*** and *numpy.**matrix*** have a **T** function:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "b7ac8dbc-dc4c-4073-a58a-9796e48756b6",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-23T03:53:35.872502Z",
     "iopub.status.busy": "2022-03-23T03:53:35.871731Z",
     "iopub.status.idle": "2022-03-23T03:53:35.878182Z",
     "shell.execute_reply": "2022-03-23T03:53:35.877523Z",
     "shell.execute_reply.started": "2022-03-23T03:53:35.872471Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "原始矩阵： \n",
      " [[ 0  1  2  3  4]\n",
      " [ 5  6  7  8  9]\n",
      " [10 11 12 13 14]]\n",
      "转置后矩阵: \n",
      " [[ 0  5 10]\n",
      " [ 1  6 11]\n",
      " [ 2  7 12]\n",
      " [ 3  8 13]\n",
      " [ 4  9 14]]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np \n",
    "m1=np.arange(0,15,1).reshape(3,5)\n",
    "m2=m1.T\n",
    "print(\"原始矩阵： \\n\",m1)\n",
    "print(\"转置后矩阵: \\n\",m2)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "eddaa41b-7b75-46c8-a875-c161e6cd8ea9",
   "metadata": {},
   "source": [
    "### 矩阵乘法\n",
    "矩阵乘法是矩阵运算中最重要的操作之一，两个矩阵$A(m \\times n),B(n \\times p)$的矩阵乘积（matrix product）是第三个矩阵$C $。为了使得乘法可以被定义，矩阵$A$ 的烈数$n$必须和矩阵$B$的行数$n$相等，得到的矩阵$C$的形状是$ m \\times p$。\n",
    "$$ C=AB $$\n",
    "对应具体$C$ 中元素 $C_{i,j}$\n",
    "$$ C_{i,j}= \\sum_k A_{i,k} B_{k,j} $$\n",
    "\n",
    ">需要注意，两个矩阵的标准乘积不是两个矩阵中对应元素的乘积，但这样的操作存在，即元素对应乘积(element-wise product)或者Hadamard乘积，记为\n",
    "$ A \\odot B$\n",
    "\n",
    "结合向量内积概念，以及矩阵是多个向量的组合，可以将矩阵乘积$C=AB$的元素$c_{i,j}$简单地描述为前一个矩阵$A$的第$i$行与后一个矩阵B中的第$j$列的**内积** 。反之，可以将两个相同维数的向量$x,y$的内积，视为第一个向量与第二个向量转置后的矩阵乘积 $xy^T$。\n",
    "\n",
    "相关定律：\n",
    "* 矩阵乘法不满足交换律（标量除外）： $AB \\neq\\; BA $\n",
    "* 矩阵乘法满足结合律： $ (AB)C=A(BC)=ABC $\n",
    "* 矩阵乘法满足分配率： $A(B+C)=AB+AC; (B+C)A=BA+VA $\n",
    "\n",
    "\n",
    "---\n",
    "Numpy中，矩阵的乘法依据创建矩阵的方式不同：\n",
    "\n",
    "1. 若使用np.array([[]])方式创建矩阵A,B则：\n",
    "\n",
    "``` python\n",
    "C=np.dot(A,B)#矩阵乘积\n",
    "m=A*B#A,B 矩阵的shape相同，得到对应元素乘积（Hadamard乘积）\n",
    "```\n",
    "2. 使用matrix创建的矩阵\n",
    "```python\n",
    "A=np.mat()\n",
    "B=np.mat()\n",
    "C=A*B#矩阵乘积直接使用 * \n",
    "m=np.multiply(A,B)# 同型矩阵对应元素乘积使用np.multiply()\n",
    "```\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "822e4600-00d2-46a0-8882-0998d729cfc9",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-23T03:59:59.495455Z",
     "iopub.status.busy": "2022-03-23T03:59:59.495004Z",
     "iopub.status.idle": "2022-03-23T03:59:59.508328Z",
     "shell.execute_reply": "2022-03-23T03:59:59.507705Z",
     "shell.execute_reply.started": "2022-03-23T03:59:59.495419Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "矩阵A： \n",
      " [[ 0  1  2  3  4]\n",
      " [ 5  6  7  8  9]\n",
      " [10 11 12 13 14]] \n",
      " 矩阵B： [[16 17 18]\n",
      " [19 20 21]\n",
      " [22 23 24]\n",
      " [25 26 27]\n",
      " [28 29 30]]\n",
      "矩阵1形状： (3, 5) 矩阵2形状： (5, 3)\n",
      "矩阵乘积： \n",
      " [[ 250  260  270]\n",
      " [ 800  835  870]\n",
      " [1350 1410 1470]]\n",
      "矩阵乘积形状: (3, 3)\n",
      "C中对应元素ij为A的i行向量与B的j列向量内积: 250\n",
      "如果是求对应元素的乘积，那么A，B矩阵的形状必须相同 \n",
      "\n",
      "A2，B矩阵对应元素乘积： [[  0  17  36]\n",
      " [ 57  80 105]\n",
      " [132 161 192]\n",
      " [225 260 297]\n",
      " [336 377 420]]\n",
      "两个向量的dot得到一个标量： 70\n",
      "两个向量对应矩阵的乘积，转换为第一个矩阵与第二个矩阵转置的dot，得到一个矩阵： [[70]]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np \n",
    "A=np.arange(0,15,1).reshape(3,5)\n",
    "B=np.arange(16,31,1).reshape(5,3)\n",
    "print('矩阵A：','\\n',A,'\\n','矩阵B：',B)\n",
    "print(\"矩阵1形状：\",A.shape,\"矩阵2形状：\",B.shape)\n",
    "C=np.dot(A,B)\n",
    "print(\"矩阵乘积：\",'\\n',C)\n",
    "print(\"矩阵乘积形状:\",C.shape)\n",
    "A_r1=A[0,:]\n",
    "B_c1=B[:,0]\n",
    "C_11=np.dot(A_r1,B_c1)\n",
    "print(\"C中对应元素ij为A的i行向量与B的j列向量内积:\",C_11)\n",
    "\n",
    "A2=A.reshape(5,3)\n",
    "print(\"如果是求对应元素的乘积，那么A，B矩阵的形状必须相同 \\n\")\n",
    "C2=A2*B\n",
    "print(\"A2，B矩阵对应元素乘积：\",C2)\n",
    "\n",
    "v1=np.array([1,2,3,4,5])\n",
    "v2=np.array([2,3,4,5,6])\n",
    "v3=np.dot(v1,v2)\n",
    "print(\"两个向量的dot得到一个标量：\",v3)\n",
    "m1=np.array([[1,2,3,4,5]])\n",
    "m2=np.array([[2,3,4,5,6]])\n",
    "m3=np.dot(m1,m2.T)\n",
    "print(\"两个向量对应矩阵的乘积，转换为第一个矩阵与第二个矩阵转置的dot，得到一个矩阵：\",m3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "1c838fd4-72ac-42eb-b5c0-80a7b49da4a1",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-23T03:38:50.283625Z",
     "iopub.status.busy": "2022-03-23T03:38:50.282745Z",
     "iopub.status.idle": "2022-03-23T03:38:50.291074Z",
     "shell.execute_reply": "2022-03-23T03:38:50.290013Z",
     "shell.execute_reply.started": "2022-03-23T03:38:50.283587Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 7 10]\n",
      " [15 22]\n",
      " [23 34]]\n",
      "[[ 7 10]\n",
      " [15 22]\n",
      " [23 34]]\n"
     ]
    }
   ],
   "source": [
    "d1=np.mat([[1,2],[3,4],[5,6]])\n",
    "d2=np.mat([[1,2],[3,4]])\n",
    "print(d1*d2)\n",
    "d3=np.array([[1,2],[3,4],[5,6]])\n",
    "d4=np.array([[1,2],[3,4]])\n",
    "print(np.dot(d3,d4))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c2672ba1-2237-48a1-89a0-8bb570026662",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "f3d1d387-b58a-4cba-8238-2beb6a9c0629",
   "metadata": {},
   "source": [
    "### 线性方程组"
   ]
  },
  {
   "cell_type": "raw",
   "id": "c7440722-0adb-427a-8c88-02b9e7347a2b",
   "metadata": {},
   "source": [
    "马尔科夫链"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d58825bc-1592-44c0-93c8-250ab030ceb3",
   "metadata": {},
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "py35-paddle1.2.0"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
